WebAssembly.Memory.prototype.grow()

grow()WebAssembly.Memory 物件的原型方法,用於將記憶體例項的大小增加指定數量的 WebAssembly 頁面。

語法

js
grow(delta)

引數

delta

要增長記憶體的 WebAssembly 頁面數(每個頁面大小為 64KiB)。

返回值

記憶體的先前大小,以 WebAssembly 頁面為單位。

異常

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

示例

使用 grow

以下示例建立一個新的 WebAssembly 記憶體例項,初始大小為 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,它可能訪問比增長 Memory 之前的緩衝區更大的記憶體範圍。buffer 屬性中的每個 SharedArrayBuffer 都將引用相同的記憶體地址範圍的開頭,因此操作相同的資料。

規範

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

瀏覽器相容性

BCD 表格僅在瀏覽器中載入

另請參閱