如何协调宿主 JS 和 Wasm 模块之间的内存访问?
How can I coordinate Memory access between the host JS and the Wasm module?
目前Webassembly只支持a handful of parameter types,即定长整数和浮点数。这意味着我只能从接受 return 数值的 C/Rust 模块定义和导出函数。
但是,according to the Mozilla Developer Network,我可以从主机操作模块的内存Javascript:
[M]emory created by JavaScript or in WebAssembly code will be accessible and mutable from both JavaScript and WebAssembly.
这听起来很有希望——它表明我可以将内存的一部分指定为字节缓冲区,在其中跨越语言障碍来回穿梭更复杂的数据。我的模块中的函数可以接受和 return 指针(它们本身是 i32
,固定大小的整数),从而在当前约束下工作。
不幸的是,我不清楚我应该如何管理这个内存。如果我需要从 JS 向 Wasm 进程传递数据,我需要直接写入 Memory 对象,但不知道 Memory 中哪些区域是空闲的。
最安全的策略是什么?我是否应该导出一对 malloc
-和-free
风格的函数,让 JS 在调用 Wasm 之前请求内存?或者是否有既定的最佳实践?
我认为最简单的是使用Emscripten,并使用其内置的malloc/free。然后导出一个函数,在 C++ 中,该函数分配通过 malloc / free 请求的内存,以及 returns 指针。这样 JavaScript 可以调用 WebAssembly 来获取尚未使用的可用内存区域。
我在 中详细介绍了如何与 JS / wasm 共享字符串,其中包含上述一些内容的详细信息。
请注意,WebAssembly 中的指针并不是真正的东西。 C++ 简单地将它们映射到从 0 开始的内存。因此,当您索引 ArrayBuffer 时,您只需要来自 C++ 的指针,不需要额外的映射。
目前Webassembly只支持a handful of parameter types,即定长整数和浮点数。这意味着我只能从接受 return 数值的 C/Rust 模块定义和导出函数。
但是,according to the Mozilla Developer Network,我可以从主机操作模块的内存Javascript:
[M]emory created by JavaScript or in WebAssembly code will be accessible and mutable from both JavaScript and WebAssembly.
这听起来很有希望——它表明我可以将内存的一部分指定为字节缓冲区,在其中跨越语言障碍来回穿梭更复杂的数据。我的模块中的函数可以接受和 return 指针(它们本身是 i32
,固定大小的整数),从而在当前约束下工作。
不幸的是,我不清楚我应该如何管理这个内存。如果我需要从 JS 向 Wasm 进程传递数据,我需要直接写入 Memory 对象,但不知道 Memory 中哪些区域是空闲的。
最安全的策略是什么?我是否应该导出一对 malloc
-和-free
风格的函数,让 JS 在调用 Wasm 之前请求内存?或者是否有既定的最佳实践?
我认为最简单的是使用Emscripten,并使用其内置的malloc/free。然后导出一个函数,在 C++ 中,该函数分配通过 malloc / free 请求的内存,以及 returns 指针。这样 JavaScript 可以调用 WebAssembly 来获取尚未使用的可用内存区域。
我在
请注意,WebAssembly 中的指针并不是真正的东西。 C++ 简单地将它们映射到从 0 开始的内存。因此,当您索引 ArrayBuffer 时,您只需要来自 C++ 的指针,不需要额外的映射。