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> |
Browser-Kompatibilität
Loading…