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 表仅在浏览器中加载

另请参阅