javascript — передача массива JS ArrayBuffer или TypedArray в Emscripten без копирования

У меня очень большой ArrayBuffer (или TypedArray) в JavaScript, который я хочу передать в функцию emscrippted. Я хотел бы передать необработанные байты без создания копии.

Если моя функция C / C ++ принимает std::string как в:

void processBuffer(std::string const& buffer)

Я могу получить данные, но IIUC, преобразование в std::string будет нести копию буфера.

Есть ли способ передать необработанный буфер без копии?
Мой доступ только для чтения.

Я старался:

void processBuffer(const char* str, size_t size);

с настройкой allow_raw_pointers() в EMSCRIPTEN_BINDINGS, но это не похоже на работу.
Что мне не хватает?

16

Решение

Отвечаю сам.
В настоящее время не существует способа, позволяющего коду C / C ++, имеющему шифрование, обращаться к буферам памяти, выделенным JS.

Это, как говорится, буферы, выделенные через Module._malloc () Можно передаваться «по указателю» при использовании C API.

Embinding добавит дополнительное копирование в типы C ++.

Для получения дополнительной информации см. этот поток в списке рассылки emscripten.

1

Другие решения

Других решений пока нет …