WebAssembly.Memory
Das WebAssembly.Memory
Objekt ist ein anpassbarer ArrayBuffer
oder SharedArrayBuffer
, der rohe Bytes des Speichers enthält, auf die von einer WebAssembly.Instance
zugegriffen wird.
Sowohl WebAssembly als auch JavaScript können Memory
-Objekte erstellen. Wenn Sie auf den Speicher zugreifen möchten, der in JS von WebAssembly erstellt wurde oder umgekehrt, können Sie den Speicher aus dem Modul nach JavaScript exportieren oder Speicher aus JavaScript in das Modul importieren, wenn es instanziiert wird.
Ursprünglich konnten Sie Speicheroperationen nur auf einen einzelnen Speicher im Wasm-Modul ausführen. Obwohl mehrere Memory
-Objekte erstellt werden konnten, machte es keinen Sinn, dies zu tun. Neuere Implementierungen ermöglichen es WebAssembly-Speicherinstruktionen auf einen bestimmten Speicher zuzugreifen. Weitere Informationen finden Sie unter Mehrere Speicher im Abschnitt Verstehen des WebAssembly-Textformats.
Hinweis: WebAssembly-Speicher ist immer im Little-Endian-Format, unabhängig von der Plattform, auf der es läuft. Daher sollten Sie Mehrbyte-Werte in JavaScript mit DataView
lesen und schreiben, um die Portabilität zu gewährleisten.
Konstruktor
WebAssembly.Memory()
-
Erzeugt ein neues
Memory
-Objekt.
Instanzeigenschaften
Memory.prototype.buffer
Nur lesbar-
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 Möglichkeiten, ein WebAssembly.Memory
-Objekt zu erhalten. Die erste Möglichkeit besteht darin, es aus JavaScript zu konstruieren. Das folgende Beispiel erzeugt eine neue WebAssembly Memory-Instanz mit einer anfänglichen Größ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 live ansehen) lädt und instanziiert den geladenen "memory.wasm"-Bytecode mit der Funktion WebAssembly.instantiateStreaming()
, während der im obigen Schritt 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, sodass stets das Little-Endian-Format verwendet wird.
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, besteht darin, es von einem WebAssembly-Modul exportieren zu lassen. Dieser Speicher kann in der Eigenschaft exports
der WebAssembly-Instanz zugegriffen werden (nachdem der Speicher im WebAssembly-Modul exportiert wurde). Das folgende Beispiel importiert einen Speicher, der aus WebAssembly mit dem Namen memory
exportiert wurde, und gibt dann das erste Element des Speichers als Uint32Array
interpretiert aus.
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 aus 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
BCD tables only load in the browser
webassembly.multiMemory
BCD tables only load in the browser
Siehe auch
- WebAssembly Überblicksseite
- WebAssembly-Konzepte
- Verwendung der WebAssembly-JavaScript-API