WebAssembly.Memory
WebAssembly.Memory
对象是一个可调整大小的 ArrayBuffer
或 SharedArrayBuffer
,它保存由 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
。
const memory = new WebAssembly.Memory({
initial: 10,
maximum: 100,
});
以下示例(请参阅 GitHub 上的 memory.html,以及 实时查看)使用 WebAssembly.instantiateStreaming()
函数获取并实例化已加载的“memory.wasm”字节码,同时导入上面一行中创建的内存。然后,它将一些值存储在该内存中,导出一个函数,并使用导出的函数对这些值求和。请注意 DataView
的使用,以便我们始终使用小端格式来访问内存。
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
。
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 创建 共享内存
const memory = new WebAssembly.Memory({
initial: 10,
maximum: 100,
shared: true,
});
此内存的 buffer
属性将返回一个 SharedArrayBuffer
。
规范
规范 |
---|
WebAssembly JavaScript 接口 # 记忆 |
未知规范 |
浏览器兼容性
webassembly.api.Memory
BCD 表仅在浏览器中加载
webassembly.multiMemory
BCD 表仅在浏览器中加载