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 â¨Oktober 2017â©.
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
delta-
Die Anzahl an WebAssembly-Seiten, um die Sie den Speicher erweitern möchten (jede einzelne ist 64KiB groÃ).
Rückgabewert
Die vorherige GröÃe des Speichers, angegeben in Einheiten von WebAssembly-Seiten.
Ausnahmen
RangeError: Wenn die aktuelle GröÃe, addiert mitdelta, 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).
const memory = new WebAssembly.Memory({
initial: 1,
maximum: 10,
});
Wir können die Instanz dann um eine Seite wie folgt vergröÃern:
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 an WebAssembly-Seiten ist.
Loslösung beim Wachsen
Jeder Aufruf von grow trennt alle Referenzen zum alten buffer, sogar bei grow(0)!
Eine Trennung bedeutet, dass die byteLength des ArrayBuffer null wird und es keine Bytes mehr gibt, die in JavaScript zugänglich sind.
Der Zugriff auf die buffer-Eigenschaft nach dem Aufruf von grow liefert 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
Für eine geteilte Memory-Instanz wird der ursprüngliche buffer (welcher in einem solchen Fall ein SharedArrayBuffer wäre) nicht getrennt, sondern seine Länge wird nicht aktualisiert. Der Zugriff auf die buffer-Eigenschaft nach der VergröÃerung liefert einen gröÃeren SharedArrayBuffer, der auf einen gröÃeren Speicherbereich zugreifen kann als der buffer von vor der VergröÃerung der Memory. Jeder SharedArrayBuffer der buffer-Eigenschaft wird sich alle auf den Anfang desselben Speicheradressbereichs beziehen und somit dieselben Daten manipulieren.
Spezifikationen
| Specification |
|---|
| WebAssembly JavaScript Interface > # dom-memory-grow > |