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 中构造它。下面的代码片段创建一个具有初始大小为 10 页(640KiB),最大大小为 100 页(6.4MiB)的新 WebAssembly Memory 实例。它的 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
加载中…
webassembly.multiMemory
加载中…