WebAssembly.Memory
Das WebAssembly.Memory
Objekt ist ein veränderbares ArrayBuffer
oder SharedArrayBuffer
, das rohe Bytes von Speicher hält, auf den von einer WebAssembly.Instance
zugegriffen wird.
Sowohl WebAssembly als auch JavaScript können Memory
Objekte erstellen.
Wenn Sie auf den in JavaScript 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 konnten Sie Speicheroperationen nur auf einem einzigen Speicher im Wasm-Modul ausführen, sodass es keinen wirklichen Sinn hatte, mehrere Memory
Objekte zu erstellen, auch wenn dies möglich war.
Neuere Implementierungen erlauben es jedoch, dass WebAssembly Speicherbefehle auf einem spezifizierten Speicher arbeiten.
Für weitere Informationen siehe Mehrere Speicher im Leitfaden Verstehen des WebAssembly-Textformats.
Hinweis:
WebAssembly-Speicher ist immer im Little-Endian-Format, unabhängig von der Plattform, auf der es ausgeführt wird. Daher sollten Sie zur Portabilität Multi-Byte-Werte in JavaScript mithilfe von DataView
lesen und schreiben.
Konstruktor
WebAssembly.Memory()
-
Erstellt ein neues
Memory
Objekt.
Instanzeigenschaften
Memory.prototype.buffer
Schreibgeschützt-
Gibt den Puffer zurück, der im Speicher enthalten ist.
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
Ein neues Memory-Objekt erstellen
Es gibt zwei Möglichkeiten, ein WebAssembly.Memory
Objekt zu erhalten. Der erste Weg ist, es aus JavaScript zu konstruieren. Das folgende Snippet erstellt eine neue WebAssembly-Speicherinstanz mit einer Anfangsgröße von 10 Seiten (640KiB) und einer maximalen Größe von 100 Seiten (6,4MiB). Ihre buffer
Eigenschaft wird ein ArrayBuffer
zurückgeben.
const memory = new WebAssembly.Memory({
initial: 10,
maximum: 100,
});
Das folgende Beispiel (siehe memory.html auf GitHub, und sehen Sie es sich auch live an) ruft die geladene "memory.wasm"-Bytecode-Datei ab und instanziiert sie mit der Funktion WebAssembly.instantiateStreaming()
, während es den oben erstellten Speicher importiert. Anschließend speichert es 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 wir immer das Little-Endian-Format 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, besteht darin, 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) zugegriffen werden. Das folgende Beispiel importiert einen Speicher, der aus WebAssembly mit dem Namen memory
exportiert wurde, und gibt 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));
});
Einen Shared Memory erstellen
Standardmäßig sind WebAssembly-Speicher nicht gemeinsam genutzt. Sie können einen gemeinsamen Speicher aus JavaScript erstellen, indem Sie im Initialisierungsobjekt des Konstruktors shared: true
übergeben:
const memory = new WebAssembly.Memory({
initial: 10,
maximum: 100,
shared: true,
});
Die buffer
Eigenschaft dieses Speichers wird einen SharedArrayBuffer
zurückgeben.
Spezifikationen
Specification |
---|
WebAssembly JavaScript Interface # memories |
Unknown specification |