WebAssembly.Memory

WebAssembly.Memory 物件是一個可調整大小的 ArrayBufferSharedArrayBuffer,它包含由 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

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

以下示例(請參閱 GitHub 上的 memory.html,以及 線上預覽)使用 WebAssembly.instantiateStreaming() 函式獲取並例項化載入的 "memory.wasm" 位元組碼,同時匯入上面一行中建立的記憶體。然後,它將一些值儲存在該記憶體中,匯出一個函式,並使用匯出的函式來對這些值求和。請注意,使用 DataView 來訪問記憶體,以便我們始終使用小端格式。

js
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

js
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 建立 共享記憶體

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

該記憶體的 buffer 屬性將返回一個 SharedArrayBuffer

規範

規範
WebAssembly JavaScript 介面
# 記憶體
未知規範

瀏覽器相容性

webassembly.api.Memory

webassembly.multiMemory

另見