WebAssembly.Memory.prototype.grow()
grow() 這一原型方法屬於 物件,它透過指定的 WebAssembly 頁面數來增加記憶體例項的大小。WebAssembly.Memory
語法
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(在這種情況下將是 )不會被分離,而是其長度不會被更新。增長後對 SharedArrayBufferbuffer 屬性的訪問將返回一個更大的 SharedArrayBuffer,該 SharedArrayBuffer 可能訪問比增長 Memory 之前的緩衝區更大的記憶體範圍。來自 buffer 屬性的每個 SharedArrayBuffer 都將指向同一記憶體地址範圍的開始,從而操作相同的資料。
規範
| 規範 |
|---|
| WebAssembly JavaScript 介面 # dom-memory-grow |
瀏覽器相容性
載入中…