WebAssembly.Memory
Das WebAssembly.Memory
Objekt ist ein erweiterbares ArrayBuffer
oder SharedArrayBuffer
, das rohe Bytes von Speicher enthält, auf die von einer WebAssembly.Instance
zugegriffen wird.
Sowohl WebAssembly als auch JavaScript können Memory
-Objekte erstellen. Wenn Sie auf den in JS erstellten Speicher von WebAssembly aus zugreifen möchten oder umgekehrt, können Sie den Speicher aus dem Modul nach JavaScript exportieren oder Speicher von JavaScript in das Modul importieren, wenn es instanziiert wird.
Ursprünglich konnte man Speicheroperationen nur auf einem einzelnen Speicher im Wasm-Modul durchführen. Obwohl mehrere Memory
-Objekte erstellt werden konnten, gab es keinen Grund dafür. Neuere Implementierungen erlauben, dass WebAssembly Speicheranweisungen auf einen bestimmten Speicher angewendet werden. Weitere Informationen finden Sie unter Mehrere Speicher im Abschnitt Verständnis des WebAssembly-Textformats.
Hinweis:
WebAssembly-Speicher ist immer im Little-Endian-Format, unabhängig von der Plattform, auf der er läuft. Daher sollten Sie mehrbyteige Werte in JavaScript mit DataView
lesen und schreiben, um die Portabilität sicherzustellen.
Konstruktor
WebAssembly.Memory()
-
Erstellt ein neues
Memory
-Objekt.
Instanzeigenschaften
Memory.prototype.buffer
Schreibgeschützt-
Gibt den im Speicher enthaltenen Puffer zurück.
Instanzmethoden
Memory.prototype.grow()
-
Erhöht die Größe der Speicherinstanz um eine angegebene Anzahl von WebAssembly-Seiten (jede ist 64KiB groß). Trennt den vorherigen
buffer
.
Beispiele
Erstellen eines neuen Memory-Objekts
Es gibt zwei Wege, ein WebAssembly.Memory
-Objekt zu erhalten. Der erste Weg ist, es aus JavaScript zu konstruieren. Der folgende Codeausschnitt erstellt eine neue WebAssembly-Speicherinstanz mit einer Anfangsgröße von 10 Seiten (640KiB) und einer maximalen Größe von 100 Seiten (6,4MiB). Die buffer
-Eigenschaft gibt einen ArrayBuffer
zurück.
const memory = new WebAssembly.Memory({
initial: 10,
maximum: 100,
});
Das folgende Beispiel (siehe memory.html auf GitHub und sehen Sie es auch live) lädt und instanziiert den "memory.wasm" Bytecode mit der Funktion WebAssembly.instantiateStreaming()
, während der oben erstellte Speicher importiert wird. Es speichert dann einige Werte in diesem Speicher, exportiert eine Funktion und verwendet die exportierte Funktion, um diese Werte zu summieren. Beachten Sie die Verwendung von DataView
, um auf den Speicher zuzugreifen und immer das Little-Endian-Format zu verwenden.
const memory = new WebAssembly.Memory({
initial: 10,
maximum: 100,
});
WebAssembly.instantiateStreaming(fetch("memory.wasm"), {
js: { mem: memory },
}).then((obj) => {
const summands = new DataView(memory.buffer);
for (let i = 0; i < 10; i++) {
summands.setUint32(i * 4, i, true); // WebAssembly is little endian
}
const sum = obj.instance.exports.accumulate(0, 10);
console.log(sum);
});
Eine andere Möglichkeit, ein WebAssembly.Memory
-Objekt zu erhalten, ist, es von einem WebAssembly-Modul exportieren zu lassen. Dieser Speicher kann in der exports
-Eigenschaft der WebAssembly-Instanz (nachdem der Speicher innerhalb des WebAssembly-Moduls exportiert wurde) aufgerufen werden. Das folgende Beispiel importiert einen aus WebAssembly exportierten Speicher mit dem Namen memory
und druckt dann das erste Element des Speichers aus, interpretiert als Uint32Array
.
WebAssembly.instantiateStreaming(fetch("memory.wasm")).then((obj) => {
const values = new DataView(obj.instance.exports.memory.buffer);
console.log(values.getUint32(0, true));
});
Erstellen eines gemeinsamen Speichers
Standardmäßig sind WebAssembly-Speicher nicht gemeinsam genutzt. Sie können einen gemeinsamen Speicher mit JavaScript erstellen, indem Sie shared: true
im Initialisierungsobjekt des Konstruktors übergeben:
const memory = new WebAssembly.Memory({
initial: 10,
maximum: 100,
shared: true,
});
Die buffer
-Eigenschaft dieses Speichers gibt einen SharedArrayBuffer
zurück.
Spezifikationen
Specification |
---|
WebAssembly JavaScript Interface # memories |
Unknown specification |
Browser-Kompatibilität
webassembly.api.Memory
Report problems with this compatibility data on GitHubdesktop | mobile | server | ||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
Memory | ||||||||||||||
Memory() constructor | ||||||||||||||
shared flag | ||||||||||||||
buffer | ||||||||||||||
grow |
Legend
Tip: you can click/tap on a cell for more information.
- Full support
- Full support
- No support
- No support
- See implementation notes.
- User must explicitly enable this feature.
webassembly.multiMemory
Report problems with this compatibility data on GitHubdesktop | mobile | |||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|
multiMemory |
Legend
Tip: you can click/tap on a cell for more information.
- Full support
- Full support
- No support
- No support
Siehe auch
- WebAssembly Übersichtsseite
- WebAssembly-Konzepte
- Verwenden der WebAssembly JavaScript API