WebAssembly.Memory.prototype.grow()
grow()
是 WebAssembly.Memory
对象的原型方法,用于将内存实例的大小增加指定数量的 WebAssembly 页面。
语法
js
grow(delta)
参数
delta
-
要增长内存的 WebAssembly 页面数(每个页面大小为 64KiB)。
返回值
内存的先前大小,以 WebAssembly 页面为单位。
异常
RangeError
: 如果当前大小加上delta
超过内存实例的最大容量。
示例
使用 grow
以下示例创建一个新的 WebAssembly 内存实例,初始大小为 1 页面(64KiB),最大大小为 10 页面(640KiB)。
js
const memory = new WebAssembly.Memory({
initial: 1,
maximum: 10,
});
然后我们可以像这样将实例增长一个页面
js
const bytesPerPage = 64 * 1024;
console.log(memory.buffer.byteLength / bytesPerPage); // "1"
console.log(memory.grow(1)); // "1"
console.log(memory.buffer.byteLength / bytesPerPage); // "2"
注意这里 grow()
的返回值是 WebAssembly 页面的先前数量。
增长时的分离
每次调用 grow
都会分离对旧 buffer
的任何引用,即使对于 grow(0)
也是如此!分离意味着 ArrayBuffer
的 byteLength
变为零,并且不再有字节可供 JavaScript 访问。调用 grow
后访问 buffer
属性将产生一个具有正确长度的 ArrayBuffer
。
js
const memory = new WebAssembly.Memory({
initial: 1,
});
const oldMemoryView = new Uint8Array(memory.buffer);
memory.grow(1);
// the array is empty!
console.log(oldMemoryView); // Uint8Array []
js
const memory = new WebAssembly.Memory({
initial: 1,
});
memory.grow(1);
const currentMemoryView = new Uint8Array(memory.buffer);
// the array is full of zeros
console.log(currentMemoryView); // Uint8Array(131072) [ 0, 0, 0, ... ]
// 131072 = 64KiB * 2
对于共享的 Memory
实例,初始 buffer
(在这种情况下将是 SharedArrayBuffer
)不会分离,但其长度不会更新。在增长后访问 buffer
属性将产生一个更大的 SharedArrayBuffer
,它可能访问比增长 Memory
之前的缓冲区更大的内存范围。buffer
属性中的每个 SharedArrayBuffer
都将引用相同的内存地址范围的开头,因此操作相同的数据。
规范
规范 |
---|
WebAssembly JavaScript 接口 # dom-memory-grow |
浏览器兼容性
BCD 表格仅在浏览器中加载