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
grow(delta)
Parameter
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üglichdeltadie 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).
const memory = new WebAssembly.Memory({
initial: 1,
maximum: 10,
});
Wir können die Instanz dann um eine Seite wie folgt erweitern:
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():
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.
const memory = new WebAssembly.Memory({
initial: 1,
});
const oldMemoryView = new Uint8Array(memory.buffer);
memory.grow(1);
// the array is empty!
console.log(oldMemoryView); // Uint8Array []
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> |