WebAssembly.Memory
Das WebAssembly.Memory-Objekt ist ein skalierbarer ArrayBuffer oder SharedArrayBuffer, der rohe Bytes von Speicher enthält, auf die ein WebAssembly.Instance zugreift.
Sowohl WebAssembly als auch JavaScript können Memory-Objekte erstellen.
Wenn Sie auf den in JS erstellten Speicher von WebAssembly zugreifen möchten, oder umgekehrt, können Sie den Speicher aus dem Modul nach JavaScript exportieren oder Speicher aus JavaScript importieren, wenn das Modul instanziiert wird.
Ursprünglich konnte man Speicheroperationen nur auf einem einzigen Speicher im Wasm-Modul ausführen, sodass es zwar möglich war, mehrere Memory-Objekte zu erstellen, dies aber keinen Sinn machte.
Neuere Implementierungen ermöglichen es WebAssembly Speicheranweisungen auf einen bestimmten Speicher zuzugreifen.
Für weitere Informationen siehe Mehrere Speicher im Verständnis des WebAssembly-Textformats.
Hinweis:
WebAssembly-Speicher ist immer im Little-Endian-Format, unabhängig von der Plattform, auf der es ausgeführt wird. Aus Portabilitätsgründen sollten Sie daher mehrbyteige Werte in JavaScript mit DataView lesen und schreiben.
Konstruktor
WebAssembly.Memory()-
Erstellt ein neues
Memory-Objekt.
Instanz-Eigenschaften
Memory.prototype.bufferSchreibgeschützt-
Gibt den im Speicher enthaltenen Puffer zurück.
Instanz-Methoden
Memory.prototype.grow()-
Erhöht die Größe der Speicherinstanz um eine angegebene Anzahl von WebAssembly-Seiten (jede ist 64KiB groß). Trennt den vorherigen
bufferab.
Beispiele
>Erstellen eines neuen Memory-Objekts
Es gibt zwei Möglichkeiten, ein WebAssembly.Memory-Objekt zu erhalten. Die erste Möglichkeit besteht darin, es über JavaScript zu konstruieren. Das folgende Snippet erstellt eine neue WebAssembly-Speicherinstanz mit einer anfänglichen Größe von 10 Seiten (640KiB) und einer maximalen Größe von 100 Seiten (6.4MiB). Ihre 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 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, sodass immer 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 über die exports-Eigenschaft der WebAssembly-Instanz zugänglich gemacht werden (nachdem der Speicher innerhalb des WebAssembly-Moduls 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 aus, interpretiert als ein 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 geteilten Speichers
Standardmäßig sind WebAssembly-Speicher nicht geteilt. Sie können einen geteilten Speicher von JavaScript erstellen, indem Sie shared: true in das 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.
Verwendung einer 64-Bit-Adresse
Das folgende Snippet erstellt eine neue WebAssembly-Speicherinstanz mit einem 64-Bit-Adressentyp.
Die initial- und maximum-Werte müssen BigInt-Werte sein:
const memory = new WebAssembly.Memory({
address: "i64",
initial: 1n,
maximum: 10n,
});
Spezifikationen
| Spezifikation |
|---|
| WebAssembly JavaScript Interface> # memories> |
| Unknown specification> |