javascript - 如何协调宿主 JS 和 Wasm 模块之间的内存访问?

标签 javascript memory memory-management webassembly

目前Webassembly只支持a handful of parameter types ,即固定大小的整数和 float 。这意味着我只能从接受和返回数值的 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.

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

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

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

最佳答案

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

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

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

关于javascript - 如何协调宿主 JS 和 Wasm 模块之间的内存访问?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44092478/

相关文章:

memory-management - 估计软件的内存大小

javascript - 如何使用 ecmascript 或 SPServices 获取类型为个人或组的 SharePoint 列表字段值?

javascript - 如何在 Redis 中找到部分匹配值并在其已存在时进行更新?

javascript - 无法连接到 Node JS 上的 Mysql 数据库

c++ - 如何存储 while 循环中产生的数据?

c - 从二进制文件读取具有动态分配变量的结构

javascript - 使用 jquery 逐字逐句淡化段落?

c++ - 就地数据操作

任何人都可以解释这两个分配之间的区别以及为什么好坏?

delphi - 将 TDictionary 排序到数组后正确处理它