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

Javascript 如何协调主机JS和Wasm模块之间的内存访问?,javascript,memory,memory-management,webassembly,Javascript,Memory,Memory Management,Webassembly,目前,Webassembly只支持固定大小的整数和浮点数。这意味着我只能从接受和返回数值的C/Rust模块中定义和导出函数 但是,我可以从主机Javascript操作模块的内存: [M] 由JavaScript或WebAssembly代码创建的emory将可以从JavaScript和WebAssembly中访问和更改 这听起来很有希望——它表明我可以将内存的一部分指定为字节缓冲区,以便在其中来回传输更复杂的数据,跨越语言障碍。我的模块中的函数可以接受和返回指针(它们本身是i32,固定大小的整数)

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

但是,我可以从主机Javascript操作模块的内存:

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

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

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


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

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

我已经详细介绍了如何与JS/wasm-in共享字符串,其中包含了上面的一些细节


请注意,WebAssembly中的指针并不是真正的东西。C++将它们简单地映射到内存,内存从0开始。因此,当你对数组缓冲区进行索引时,只需要从C++中得到指针,就不需要额外的映射。我注意到emscripten的
malloc
实现可以触发
grow\u memory
操作。你知道这是否会使已经发出的指针失效吗?或者,该过程是否保留了原始内存布局?虽然您可以将Emscripten配置为永不增长,但如果它变为OOM,则始终会预分配并失败。如何发现ArrayBuffer已失效?在JS中访问它会导致异常吗?(或者我误解了你对“中性”的使用吗?)对不起,这是我应该说的。一旦它成功成长,它就会这样做。但我不相信埃姆斯克里彭会告诉你!分离时,
bytellength
将变为
0
。WebAssembly详细信息:正确,指针仍然有效,因为它们是内存/ArrayBuffer中的索引。底层虚拟内存可能会移动,但这在WebAssembly/JavaScript中是不可见的。