Dieser Inhalt wurde automatisch aus dem Englischen übersetzt, und kann Fehler enthalten. Erfahre mehr über dieses Experiment.

View in English Always switch to English

WebAssembly.Memory.prototype.grow()

Baseline Weitgehend verfügbar

Diese Funktion ist gut etabliert und funktioniert auf vielen Geräten und in vielen Browserversionen. Sie ist seit Oktober 2017 browserübergreifend verfügbar.

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 erweitern möchten (jede hat eine Größe von 64KiB). Für Speicher mit einem Adresstyp von "i64" muss dies ein BigInt-Wert sein.

Rückgabewert

Die vorherige Größe des Speichers, in Einheiten von WebAssembly-Seiten. Für Speicher mit einem Adresstyp von "i64" ist dies ein BigInt-Wert.

Ausnahmen

  • RangeError: Wenn die aktuelle Größe zuzüglich delta die maximale Kapazität der Speicherinstanz überschreitet.

Beispiele

Verwendung von grow

Das folgende Beispiel erstellt eine neue WebAssembly-Speicherinstanz mit einer anfänglichen Größ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 die Instanz dann um eine Seite wie folgt erweitern:

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.

Erweitern eines 64-Bit-Speichers

Für Speicher mit einem Adresstyp von "i64" verwenden Sie einen BigInt-Wert für grow():

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

console.log(memory.grow(1n)); // 1n

Abtrennen beim Erweitern

Jeder Aufruf von grow trennt alle Verweise auf den alten buffer ab, selbst bei grow(0)! Das Abtrennen bedeutet, dass die byteLength des ArrayBuffer zu null wird und keine Bytes mehr für JavaScript zugänglich sind. Der Zugriff 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

Bei einer geteilten Memory-Instanz wird der ursprüngliche buffer (in einem solchen Fall ein SharedArrayBuffer) nicht abgetrennt, sondern seine Länge wird nicht aktualisiert. Der Zugriff auf die buffer-Eigenschaft nach dem Erweitern ergibt einen größeren SharedArrayBuffer, der möglicherweise einen größeren Speicherbereich als der Puffer vor dem Erweitern des Memory zugänglich macht. Jeder SharedArrayBuffer von der buffer-Eigenschaft wird auf denselben Speicheradressbereich verweisen und somit dieselben Daten manipulieren.

Spezifikationen

Spezifikation
WebAssembly JavaScript Interface
# dom-memory-grow

Browser-Kompatibilität

Siehe auch