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 構造它。以下程式碼段建立了一個新的 WebAssembly Memory 例項,初始大小為 10 頁(640KiB),最大大小為 100 頁(6.4MiB)。它的 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

BCD 表僅在瀏覽器中載入

webassembly.multiMemory

BCD 表僅在瀏覽器中載入

另請參閱