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

webassembly.multiMemory

Siehe auch