4

目前,Webassembly 仅支持少数几种参数类型,即固定大小的整数和浮点数。这意味着我只能从接受和返回数值的 C/Rust 模块中定义和导出函数。

但是,根据 Mozilla Developer Network,我可以从主机 Javascript 操作模块的内存:

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

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

不幸的是,目前尚不清楚我应该如何管理这些内存。如果我需要将数据从 JS 传递到 Wasm 进程,我需要直接写入 Memory 对象,但不知道 Memory 中哪些区域是空闲的。

什么是最安全的策略?我应该导出一对malloc-and-free风格的函数,让 JS 在调用 Wasm 之前请求内存吗?还是有既定的最佳实践?

4

1 回答 1

3

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

我在这个答案中详细介绍了如何与 JS/wasm 共享字符串,其中包含上述一些内容的详细信息。

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

于 2017-05-21T02:08:16.283 回答