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.

js
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.

js
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.

js
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:

js
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 GitHub
desktopmobileserver
Chrome
Edge
Firefox
Opera
Safari
Chrome Android
Firefox for Android
Opera Android
Safari on iOS
Samsung Internet
WebView Android
WebView on iOS
Deno
Node.js
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 GitHub
desktopmobile
Chrome
Edge
Firefox
Opera
Safari
Chrome Android
Firefox for Android
Opera Android
Safari on iOS
Samsung Internet
WebView Android
WebView on iOS
multiMemory

Legend

Tip: you can click/tap on a cell for more information.

Full support
Full support
No support
No support

Siehe auch