【发布时间】:2017-07-15 01:28:37
【问题描述】:
我在 JavaScript 中有一个非常大的 ArrayBuffer(或 TypedArray),我想将它传递给一个 emscriptened 函数。我想传递原始字节而不产生副本。
如果我的 C/C++ 函数采用 std::string,如下所示:
void processBuffer(std::string const& buffer)
我可以获取数据,但是 IIUC,转换为 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);好,而不是JS中的new Uint8Array(bytes)? -
是的。如果缓冲区是通过
Module._malloc()分配的,并直接传递给期望char* ptr的asm.js 函数,则不会产生副本(正如在emscripten 论坛上向我解释的那样)。稍后将发布完整答案。 -
@zakki 从网络读取数据或写入 HTML5 画布时,不能使用预先分配的缓冲区;缓冲区由浏览器分配。 emscripten 似乎没有办法直接访问原生 JS 对象,即使在
EM_ASM块内也是如此,这真的很奇怪。
标签: javascript c++ emscripten arraybuffer typedarray