WebAssembly.Memory
WebAssembly.Memory 物件是一個可調整大小的 ArrayBuffer 或 SharedArrayBuffer,它包含由 WebAssembly.Instance 訪問的原始記憶體位元組。
WebAssembly 和 JavaScript 都可以建立 Memory 物件。如果你想從 WebAssembly 訪問 JS 中建立的記憶體,反之亦然,可以在 例項化 時將記憶體從模組匯出到 JavaScript,或者從 JavaScript 匯入記憶體到模組。
最初,你只能在 Wasm 模組中對單個記憶體執行記憶體操作,因此雖然可以建立多個 Memory 物件,但這樣做並沒有意義。較新的實現允許 WebAssembly 記憶體指令 對指定的記憶體進行操作。有關更多資訊,請參閱《理解 WebAssembly 文字格式》中的 多個記憶體。
注意: WebAssembly 記憶體始終採用小端格式,無論其執行在哪個平臺。因此,為了可移植性,你應該使用 DataView 在 JavaScript 中讀寫多位元組值。
建構函式
WebAssembly.Memory()-
建立一個新的
Memory物件。
例項屬性
Memory.prototype.buffer只讀-
返回記憶體中包含的緩衝區。
例項方法
Memory.prototype.grow()-
透過指定數量的 WebAssembly 頁面(每個頁面大小為 64KiB)來增加記憶體例項的大小。會分離之前的
buffer。
示例
建立新的 Memory 物件
獲取 WebAssembly.Memory 物件有兩種方法。第一種方法是從 JavaScript 中構造它。下面的程式碼片段建立一個具有初始大小為 10 頁(640KiB),最大大小為 100 頁(6.4MiB)的新 WebAssembly Memory 例項。它的 buffer 屬性將返回一個 ArrayBuffer。
const memory = new WebAssembly.Memory({
initial: 10,
maximum: 100,
});
以下示例(請參閱 GitHub 上的 memory.html,以及 線上預覽)使用 WebAssembly.instantiateStreaming() 函式獲取並例項化載入的 "memory.wasm" 位元組碼,同時匯入上面一行中建立的記憶體。然後,它將一些值儲存在該記憶體中,匯出一個函式,並使用匯出的函式來對這些值求和。請注意,使用 DataView 來訪問記憶體,以便我們始終使用小端格式。
const memory = new WebAssembly.Memory({
initial: 10,
maximum: 100,
});
WebAssembly.instantiateStreaming(fetch("memory.wasm"), {
js: { mem: memory },
}).then((obj) => {
const summands = new DataView(memory.buffer);
for (let i = 0; i < 10; i++) {
summands.setUint32(i * 4, i, true); // WebAssembly is little endian
}
const sum = obj.instance.exports.accumulate(0, 10);
console.log(sum);
});
獲取 WebAssembly.Memory 物件的另一種方法是讓它由 WebAssembly 模組匯出。此記憶體可以在 WebAssembly 例項的 exports 屬性中訪問(前提是該記憶體已在 WebAssembly 模組中匯出)。下面的示例匯入了一個從 WebAssembly 匯出的名為 memory 的記憶體,然後打印出記憶體的第一個元素,並將其解釋為 Uint32Array。
WebAssembly.instantiateStreaming(fetch("memory.wasm")).then((obj) => {
const values = new DataView(obj.instance.exports.memory.buffer);
console.log(values.getUint32(0, true));
});
建立共享記憶體
預設情況下,WebAssembly 記憶體是未共享的。可以透過在建構函式的初始化物件中傳遞 shared: true 來從 JavaScript 建立 共享記憶體。
const memory = new WebAssembly.Memory({
initial: 10,
maximum: 100,
shared: true,
});
該記憶體的 buffer 屬性將返回一個 SharedArrayBuffer。
規範
| 規範 |
|---|
| WebAssembly JavaScript 介面 # 記憶體 |
| 未知規範 |
瀏覽器相容性
webassembly.api.Memory
載入中…
webassembly.multiMemory
載入中…