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

另见