如何协调主机JS和WASM模块之间的内存访问?

时间:2017-05-21 02:02:36

标签: javascript memory memory-management webassembly

目前,Webassembly仅支持a handful of parameter types,即固定大小的整数和浮点数。这意味着我只能从接受和返回数值的C / Rust模块中定义和导出函数。

然而,according to the Mozilla Developer Network,我可以从主机Javascript操作模块的内存:

  

由JavaScript或WebAssembly代码创建的[M] emory将可以从JavaScript和WebAssembly中访问和更改。

这听起来很有希望 - 它表明我可以将部分内存指定为字节缓冲区,在其中跨越语言障碍来回传递更复杂的数据。我的模块中的函数可以接受并返回指针(它们本身是i32,固定大小的整数),从而在当前约束内工作。

不幸的是,目前尚不清楚我应该如何管理这段记忆。如果我需要从JS传递数据到WASM进程,我需要直接写入Memory对象,但不知道Memory中哪些区域是免费的。

最安全的策略是什么?我应该导出一对malloc - 和 - free样式的函数,这些函数在调用WASM之前为JS提供了一种请求内存的方法吗?或者是否有既定的最佳实践?

1 个答案:

答案 0 :(得分:3)

我认为最简单的方法是使用Emscripten,并使用其内置的malloc / free。然后导出一个函数,该函数在C ++中通过malloc / free分配请求的内存,并返回指针。这样JavaScript就可以调用WebAssembly来获得一个尚未使用的可用内存区域。

我已经详细介绍了如何在this answer中与JS / wasm共享字符串,其中包含上述部分内容的详细信息。

请注意,WebAssembly中的指针并不是真正的东西。 C ++只是将它们映射到Memory,从0开始。因此,当你索引ArrayBuffer时,你只需要来自C ++的指针,不需要额外的映射。