WebAssembly核心编程中的Memory,如何实现的疑问?
摘要:由于Memory存储的是单纯的二进制字节,所以原则上我们可以用来它作为媒介,在wasm模块和数组程序之间传递任何类型的数据。在JavaScript API中,Memory通过WebAssembly.Memory类型表示,我们一般将它内部的缓
由于Memory存储的是单纯的二进制字节,所以原则上我们可以用来它作为媒介,在wasm模块和数组程序之间传递任何类型的数据。在JavaScript API中,Memory通过WebAssembly.Memory类型表示,我们一般将它内部的缓冲区映射相应类型的数组进行处理。WebAssembly也提供了相应的指令来提供针对Memory的读、写、扩容等操作(源代码从这里下载)。
一、容量限制与扩容
二、内容的读写
三、内容初始化
四、多Memory支持
五、批量内存处理
一、容量限制与扩容Memory本质上一个可以扩容的内存缓冲区,在初始化的时候我们必需指定该缓冲器的初始大小,单位为Page(64K)。如果没有指定最大允许的大小,意味着它可以无限“扩容”。WebAssembly.Memory的实例方法grow用来扩容,作为参数的整数表示扩大的Page数量,其返回值表示扩容之前的容量。在如下这个演示实例中,我们在一个Web页面index.html初始化的时候创建了一个WebAssembly.Memory对象,并将其初始和最大尺寸设置为1和3。
<html>
<head></head>
<body>
<script>
var memory= new WebAssembly.Memory({ initial: 1, maximum: 3});
var grow = (size) => {
try{
console.log(`memory.grow(${size}) = ${memory.grow(size)}`);
}
catch(error){
console.log(error);
}
};
grow(1);
grow(1);
grow(1);
</script>
</body>
</html>grow函数对这个WebAssembly.Memory试试扩容。我们先后3次调用次函数(增扩的容量为1),并将其返回值打印到控制台上。从如下的输出可以看出,创建的Memory的初始容量为1,经过两次扩容后,它的容量达到运行的最大容量3,进而导致第三次扩容失败。
针对Memory的扩容也利用利用wasm的memory.grow指令来完成,该指令的输入参数依然是扩大的容量,返回的依然是扩容前的大小。如果超过设定的最大容量,该指令会返回-1。wasm还提供了memory.size指令返回Memory当前的容量。在如下这个wat文件(app.wat)中,我们依然定义了一个初始和最大容量为1和3的Memory,两个导出的函数size和grow分别返回它当前容量和对它实施扩容。
(module
(memory 1 3)
(func (export "size") (result i32)
(memory.size)
)
(func (export "grow") (param $size i32) (result i32)
(memory.grow (local.get $size))
)
)在作为宿主的index.html页面中,我们调用导出的grow函数(增扩的容量为1)对Memory实施3次扩容,并调用size函数输出它当前的容量。
