WebAssembly.Memory() 构造函数
WebAssembly.Memory() 构造函数创建一个新的 Memory 对象,其 buffer 属性是一个可调整大小的 ArrayBuffer 或 SharedArrayBuffer,它保存由 WebAssembly.Instance 访问的原始内存字节。
由 JavaScript 或 WebAssembly 代码创建的内存对象,只要代码构造了该对象或获得了该对象的引用,就可以从 JavaScript 和 WebAssembly 中进行访问和修改。
WebAssembly 和 JavaScript 都可以创建 Memory 对象。如果您想从 Wasm 访问 JS 创建的内存,或者反之亦然,您可以将内存的引用从一端传递到另一端。
语法
new WebAssembly.Memory(memoryDescriptor)
参数
memoryDescriptor-
一个可以包含以下成员的对象
initial-
WebAssembly Memory 的初始大小,以 WebAssembly 页为单位。
maximum可选-
WebAssembly Memory 允许增长到的最大大小,以 WebAssembly 页为单位。当存在时,
maximum参数作为提示,指示引擎提前预留内存。但是,引擎可能会忽略或限制此预留请求。非共享的 WebAssembly 内存不需要设置maximum,但共享内存需要。 -
一个布尔值,定义内存是否为共享内存。如果设置为
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。
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 创建一个共享内存。
const memory = new WebAssembly.Memory({
initial: 10,
maximum: 100,
shared: true,
});
此内存的 buffer 属性将返回一个 SharedArrayBuffer。
规范
| 规范 |
|---|
| WebAssembly JavaScript 接口 # dom-memory-memory |
shared 属性仅在 WebAssembly 的线程提案中进行了文档记录,而不是官方规范的一部分。
浏览器兼容性
加载中…