WebAssembly.Memory.prototype.grow()

Baseline 已廣泛支援

此功能已非常成熟,可在多種裝置和瀏覽器版本上使用。自 2017 年 10 月以來,它已在各大瀏覽器中可用。

grow() 這一原型方法屬於 WebAssembly.Memory 物件,它透過指定的 WebAssembly 頁面數來增加記憶體例項的大小。

語法

js
grow(delta)

引數

delta

您希望記憶體增加的 WebAssembly 頁面數(每個頁面大小為 64KiB)。

返回值

記憶體之前的尺寸,以 WebAssembly 頁面為單位。

異常

  • RangeError:如果當前大小加上 delta 超過了記憶體例項的最大容量。

示例

使用 grow

下面的示例建立一個新的 WebAssembly Memory 例項,初始大小為 1 頁(64KiB),最大大小為 10 頁(640KiB)。

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

然後我們可以像這樣將例項增加一頁:

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"

請注意,這裡 grow() 的返回值是之前的 WebAssembly 頁面數。

增長時分離

每次呼叫 grow 都會分離對舊 buffer 的所有引用,即使是 grow(0)!分離意味著 ArrayBufferbyteLength 變為零,並且 JavaScript 不再能訪問其位元組。在呼叫 grow 後訪問 buffer 屬性將返回一個長度正確的 ArrayBuffer

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

對於共享的 Memory 例項,初始 buffer(在這種情況下將是 SharedArrayBuffer)不會被分離,而是其長度不會被更新。增長後對 buffer 屬性的訪問將返回一個更大的 SharedArrayBuffer,該 SharedArrayBuffer 可能訪問比增長 Memory 之前的緩衝區更大的記憶體範圍。來自 buffer 屬性的每個 SharedArrayBuffer 都將指向同一記憶體地址範圍的開始,從而操作相同的資料。

規範

規範
WebAssembly JavaScript 介面
# dom-memory-grow

瀏覽器相容性

另見