我在JavaScript中有一个非常大的ArrayBuffer(或TypedArray),我想将其传递给emscriptened函数。 我想传递原始字节而不产生副本。
如果我的C / C ++函数需要一个std :: string,如下所示:
void processBuffer(std::string const& buffer)
我可以获取数据,但如果我理解正确,将其转换为 std::string
将会导致缓冲区的复制。
有没有一种方法可以在不复制的情况下传递原始缓冲区?
我的访问权限仅限于只读。
我尝试过:
void processBuffer(const char* str, size_t size);
在EMSCRIPTEN_BINDINGS
中设置allow_raw_pointers()
,但似乎不起作用。
我错过了什么吗?
var ptr = Module._malloc(bytes); new Uint8Array(Module.HEAPU8.buffer, ptr, bytes);
这种写法不是更好吗?相比之下,new Uint8Array(bytes)
好像没有这么高效。 - zakkiModule._malloc()
分配并直接传递给期望char* ptr
的 asm.js 函数,它将不会产生复制(正如在 emscripten 论坛上友好地向我解释的那样)。稍后会发布完整答案。 - Adi ShavitEM_ASM
块内也是如此。 - HRJ