WebAssembly.Memory.prototype.grow()

Baseline Widely available

This feature is well established and works across many devices and browser versions. It’s been available across browsers since October 2017.

Die grow() Prototyp-Methode des WebAssembly.Memory Objekts erhöht die Größe der Speicherinstanz um eine angegebene Anzahl von WebAssembly-Seiten.

Syntax

js
grow(delta)

Parameter

delta

Die Anzahl von WebAssembly-Seiten, um die Sie den Speicher vergrößern möchten (jede Seite ist 64KiB groß).

Rückgabewert

Die vorherige Größe des Speichers in Einheiten von WebAssembly-Seiten.

Ausnahmen

  • RangeError: Wenn die aktuelle Größe zusammen mit delta die maximale Kapazität der Memory-Instanz überschreitet.

Beispiele

Nutzung von grow

Im folgenden Beispiel wird eine neue WebAssembly-Speicherinstanz mit einer Anfangsgröße von 1 Seite (64KiB) und einer maximalen Größe von 10 Seiten (640KiB) erstellt.

js
const memory = new WebAssembly.Memory({
  initial: 1,
  maximum: 10,
});

Wir können dann die Instanz um eine Seite wie folgt vergrößern:

js
const bytesPerPage = 64 * 1024;
console.log(memory.buffer.byteLength / bytesPerPage); // "1"
console.log(memory.grow(1)); // "1"
console.log(memory.buffer.byteLength / bytesPerPage); // "2"

Beachten Sie, dass der Rückgabewert von grow() hier die vorherige Anzahl von WebAssembly-Seiten ist.

Ablösung beim Vergrößern

Jeder Aufruf von grow löst alle Referenzen zum alten buffer, selbst bei grow(0). Ablösung bedeutet, dass die byteLength des ArrayBuffer null wird und er keine Bytes mehr hat, auf die JavaScript zugreifen kann. Der Zugriff auf die buffer Eigenschaft nach dem Aufruf von grow liefert einen ArrayBuffer mit der richtigen Länge.

js
const memory = new WebAssembly.Memory({
  initial: 1,
});
const oldMemoryView = new Uint8Array(memory.buffer);
memory.grow(1);
// the array is empty!
console.log(oldMemoryView); // Uint8Array []
js
const memory = new WebAssembly.Memory({
  initial: 1,
});
memory.grow(1);
const currentMemoryView = new Uint8Array(memory.buffer);
// the array is full of zeros
console.log(currentMemoryView); // Uint8Array(131072) [ 0, 0, 0, ... ]
// 131072 = 64KiB * 2

Bei einer freigegebenen Memory-Instanz wird der initiale buffer (in diesem Fall ein SharedArrayBuffer) nicht abgelöst, sondern seine Länge wird nicht aktualisiert. Zugriffe auf die buffer Eigenschaft nach dem Wachsen geben einen größeren SharedArrayBuffer zurück, der möglicherweise auf einen größeren Speicherbereich zugreifen kann als der Buffer vor dem Wachsen der Memory. Jeder SharedArrayBuffer aus der buffer Eigenschaft bezieht sich auf den Anfang desselben Speicheradressbereichs und manipuliert somit dieselben Daten.

Spezifikationen

Specification
WebAssembly JavaScript Interface
# dom-memory-grow

Browser-Kompatibilität

BCD tables only load in the browser

Siehe auch