将 JS ArrayBuffer 或 TypedArray 传递给 Emscripten w/o
Passing a JS ArrayBuffer or TypedArray to Emscripten w/o Copying
我在 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()
,但这似乎不起作用。
我错过了什么?
自己回答。
就目前而言,没有办法允许嵌入的 C/C++ 代码访问 JS 分配的内存缓冲区。
也就是说,当使用 C API.
时,通过 Module._malloc()
分配的缓冲区可以 “通过指针”传递
Embinding 将向 C++ 类型添加额外的复制。
有关详细信息,请参阅 emscripten 邮件列表上的 this 主题。
我在 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()
,但这似乎不起作用。
我错过了什么?
自己回答。
就目前而言,没有办法允许嵌入的 C/C++ 代码访问 JS 分配的内存缓冲区。
也就是说,当使用 C API.
时,通过Module._malloc()
分配的缓冲区可以 “通过指针”传递
Embinding 将向 C++ 类型添加额外的复制。
有关详细信息,请参阅 emscripten 邮件列表上的 this 主题。