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) 也是如此!分離意味著 ArrayBuffer 的 byteLength 變為零,並且不再有位元組可供 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 表格僅在瀏覽器中載入