WebAssembly.Memory.prototype.grow()

Baseline 已广泛支持

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

grow() 这一原型方法属于 WebAssembly.Memory 对象,它通过指定的 WebAssembly 页面数来增加内存实例的大小。

语法

js
grow(delta)

参数

delta

您希望内存增加的 WebAssembly 页面数(每个页面大小为 64KiB)。

返回值

内存之前的尺寸,以 WebAssembly 页面为单位。

异常

  • RangeError:如果当前大小加上 delta 超过了内存实例的最大容量。

示例

使用 grow

下面的示例创建一个新的 WebAssembly Memory 实例,初始大小为 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)!分离意味着 ArrayBufferbyteLength 变为零,并且 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,该 SharedArrayBuffer 可能访问比增长 Memory 之前的缓冲区更大的内存范围。来自 buffer 属性的每个 SharedArrayBuffer 都将指向同一内存地址范围的开始,从而操作相同的数据。

规范

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

浏览器兼容性

另见