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 der WebAssembly-Seiten, um die Sie den Speicher vergrößern möchten (jede ist 64KiB groß).

Rückgabewert

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

Ausnahmen

  • RangeError: Wenn die aktuelle Größe plus delta die maximale Größenkapazität der Speicherinstanz überschreitet.

Beispiele

Verwendung von grow

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

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 der WebAssembly-Seiten ist.

Abtrennung beim Vergrößern

Jeder Aufruf von grow wird alle Verweise auf den alten buffer abtrennen, selbst bei grow(0)! Abtrennung bedeutet, dass das byteLength des ArrayBuffer zu null wird und keine Bytes mehr für JavaScript zugänglich sind. Das Zugreifen auf die buffer-Eigenschaft nach dem Aufruf von grow ergibt einen ArrayBuffer mit der korrekten 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

Für eine geteilte Memory-Instanz wird der anfängliche buffer (der in einem solchen Fall ein SharedArrayBuffer wäre) nicht abgetrennt, sondern seine Länge wird nicht aktualisiert. Zugriffe auf die buffer-Eigenschaft nach dem Vergrößern ergeben einen größeren SharedArrayBuffer, der möglicherweise einen größeren Speicherbereich als der Puffer vor dem Vergrößern des Memory zugänglich macht. Jeder SharedArrayBuffer aus der buffer-Eigenschaft wird alle auf den Beginn des gleichen Speicheradressbereichs verweisen und somit dieselben Daten manipulieren.

Spezifikationen

Specification
WebAssembly JavaScript Interface
# dom-memory-grow

Browser-Kompatibilität

BCD tables only load in the browser

Siehe auch