当前,Webassembly仅支持a handful of parameter types,即固定大小的整数和浮点数.这意味着我只能从接受和返回数值的C / Rust模块中定义和导出函数.
[M]emory created by JavaScript or in WebAssembly code will be accessible and mutable from both JavaScript and WebAssembly.
这听起来非常有前途-这表明我可以将内存的一部分指定为字节缓冲区,以便在其中跨语言障碍来回传递更复杂的数据.我模块中的函数可以接受和返回指针(它们本身是i32,固定大小的整数),从而在当前约束下工作.
不幸的是,目前尚不清楚我应该如何管理该内存.如果需要将数据从JS传递到WASM进程,则需要直接写入Memory对象,但不知道Memory中的哪些区域可用.
最安全的策略是什么?是否应该导出一对malloc-and-free-style函数,这些函数为JS提供了在调用WASM之前请求内存的方法?还是有既定的最佳实践?
解决方法:
我认为最简单的方法是使用Emscripten,并使用其内置的malloc / free.然后导出一个函数,该函数在C中分配通过该malloc / free请求的内存,并返回指针.这样,JavaScript可以调用WebAssembly以获取尚未使用的可用内存区域.
我已经详细说明了如何在this answer中与JS / wasm共享字符串/从JS / wasm共享字符串,上面有一些细节.
请注意,WebAssembly中的指针并不是真正的东西. C只是将它们映射到从0开始的Memory.因此,当对ArrayBuffer进行索引时,只需要C的指针,就不需要额外的映射.
标签:webassembly,memory,memory-management,javascript
来源: https://codeday.me/bug/20191111/2019259.html