WebAssembly.Memory() 构造函数

Baseline 已广泛支持

此功能已非常成熟,可在多种设备和浏览器版本上使用。自 2017 年 10 月以来,它已在各大浏览器中可用。

WebAssembly.Memory() 构造函数创建一个新的 Memory 对象,其 buffer 属性是一个可调整大小的 ArrayBufferSharedArrayBuffer,它保存由 WebAssembly.Instance 访问的原始内存字节。

由 JavaScript 或 WebAssembly 代码创建的内存对象,只要代码构造了该对象或获得了该对象的引用,就可以从 JavaScript 和 WebAssembly 中进行访问和修改。

WebAssembly 和 JavaScript 都可以创建 Memory 对象。如果您想从 Wasm 访问 JS 创建的内存,或者反之亦然,您可以将内存的引用从一端传递到另一端。

语法

js
new WebAssembly.Memory(memoryDescriptor)

参数

memoryDescriptor

一个可以包含以下成员的对象

initial

WebAssembly Memory 的初始大小,以 WebAssembly 页为单位。

maximum 可选

WebAssembly Memory 允许增长到的最大大小,以 WebAssembly 页为单位。当存在时,maximum 参数作为提示,指示引擎提前预留内存。但是,引擎可能会忽略或限制此预留请求。非共享的 WebAssembly 内存不需要设置 maximum,但共享内存需要。

shared 可选

一个布尔值,定义内存是否为共享内存。如果设置为 true,则为共享内存。默认为 false

注意: WebAssembly 页的大小固定为 65,536 字节,即 64KiB。

异常

TypeError

如果满足以下任一条件,则抛出异常

  • memoryDescriptor 不是一个对象。
  • 未指定 initial
  • 指定了 shared 且其值为 true,但未指定 maximum
RangeError

如果满足以下任一条件,则抛出异常

  • 指定了 maximum 且其值小于 initial
  • initial 超过 65,536 (2^16)。2^16 页是 2^16 * 64KiB = 4GiB 字节,这是 Wasm 模块可以寻址的最大范围,因为 Wasm 目前仅支持 32 位寻址。
  • 分配失败。这可能是由于尝试一次分配过多内存,或者用户代理内存不足。

示例

创建新的 Memory 实例

有两种方法可以获取 WebAssembly.Memory 对象:从 JavaScript 构造它,或者由 WebAssembly 模块导出它。

以下示例(请参阅 GitHub 上的 memory.html,以及 在线查看)创建一个新的 WebAssembly Memory 实例,初始大小为 10 页 (640KiB),最大大小为 100 页 (6.4MiB)。该示例使用 WebAssembly.instantiateStreaming() 函数获取并实例化加载的 memory.wasm 字节码,同时导入上面一行创建的内存。然后,它在该内存中存储一些值,导出函数,并使用导出的函数来汇总这些值。Memory 对象的 buffer 属性将返回一个 ArrayBuffer

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 内存是非共享的。您可以通过在构造函数的初始化对象中传递 shared: true,从 JavaScript 创建一个共享内存

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

此内存的 buffer 属性将返回一个 SharedArrayBuffer

规范

规范
WebAssembly JavaScript 接口
# dom-memory-memory

shared 属性仅在 WebAssembly 的线程提案中进行了文档记录,而不是官方规范的一部分。

浏览器兼容性

另见