You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在Emscripten中不使用vector将JS数组作为C数组传入函数

Emscripten 实现JS数组直接传递给C普通数组的方案

C++侧代码

不需要额外引入vector逻辑,直接保留你需要的原生C数组函数逻辑即可,仅需添加导出标记:

#include <emscripten.h>

EMSCRIPTEN_KEEPALIVE
int add(const int test[], const int size)
{
    int res = 0;
    for (int i = 0; i < size; i++)
        res += test[i];
    return res;
}

编译命令

编译时需要导出内存操作相关的依赖函数,示例编译指令:

emcc test.cpp -o test.js -s EXPORTED_FUNCTIONS=['_add','_malloc','_free'] -s EXPORTED_RUNTIME_METHODS=['ccall','cwrap']

JS侧调用实现

直接通过内存批量拷贝的方式传递数组,不需要逐个转存到vector,性能开销极低:

// 示例JS数组
const jsArray = [1, 2, 3, 4, 5];
// 转换为和C数组元素类型对应的TypedArray,int类型对应Int32Array
const typedArray = new Int32Array(jsArray);
// 分配对应大小的堆内存:数组长度 * 单个int的字节数(4)
const ptr = Module._malloc(typedArray.length * typedArray.BYTES_PER_ELEMENT);
// 批量将JS数组内容写入Emscripten堆内存
Module.HEAP32.set(typedArray, ptr / typedArray.BYTES_PER_ELEMENT);
// 直接调用C函数,传入内存指针和数组长度
const result = Module._add(ptr, typedArray.length);
console.log(result); // 输出运算结果15
// 手动释放分配的内存,避免内存泄漏
Module._free(ptr);

该方案直接在内存层面批量拷贝数据,省略了vector逐个插入元素的开销,性能接近原生C数组操作的效率,操作流程也更简洁。

注意事项

  • 要保证TypedArray的类型和C数组的元素类型严格对应,比如C用short就用Int16Array,用unsigned int就用Uint32Array,避免类型错位导致数据错误
  • 分配的内存用完必须手动释放,否则会出现内存泄漏

内容的提问来源于stack exchange,提问作者Ari

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.03 01:09:01