webassembly[一] Memory 学习

Memory

Linear memory 是 WebAssembly 的另外一种构建块,通常用于表示编译的 C/C++ 应用程序的整个堆。从 JavaScript 的角度,linear memory(后面称作 memory)可以被认为是一个可以调整大小的 ArrayBuffer,它是通过尽心优化的,用于负载和存储的低开销沙箱。

Memories 可以被 JavaScript 创建,需要提供出初始大小和最大的大小这些选项。

var memory = new WebAssembly.Memory({initial:10, maximum:100});

首先要注意的是,“initial” 和 “maximum” 的单位是 WebAssembly pages,它固定为64KiB。这样,上面的 memory 默认就是 10 pages,640Kib,最大的尺寸是6.4MiB。

在 JavaScript 中大多数的字节操作都是在 ArrayBuffer 和 类型数组里面,而不是建立了一套新的不兼容的操作方式,WebAssembly.Memory 通过简单的提供一个返回 ArrayBuffer 的 buffer getter 来返回字节码。比如,将 42 写入 linear memory 的第一个位置。

new Uint32Array(memory.buffer)[0] = 42;

一旦被创建,可以通过 Memory.Prototype.grow 进行扩充,还是以 WebAssembly pages 为单位当做参数。

memory.grow(1);

如果 maximum 供不应求了,通过 grow 增加的尺寸大于 maximum,就会抛出 RangeError 异常。引擎利用这个提供的上限来提前预留内存,这样可以使调整大小更有效率。

文章来源: webassembly[一] Memory 学习