Emscripten 如何实施";malloc“;在瓦斯姆

Emscripten 如何实施";malloc“;在瓦斯姆,emscripten,webassembly,Emscripten,Webassembly,我现在正在学习WebAssembly,我发现Wasm world无法轻松访问外部函数(libc或第三方函数)(使用导入是一种通用解决方案) 我试图使用emcc将我的源代码编译成wasm,但是malloc和free在我的源代码中被广泛使用。我认为从现实世界导入malloc和free是不可行的 所以,我很好奇如何在wasm世界中实现malloc。我已经知道malloc在glibc中是如何工作的:使用brk()或sbrk()扩展堆,并对线性地址进行一些内存管理。但在wasm的世界里,我认为调用brk(

我现在正在学习
WebAssembly
,我发现Wasm world无法轻松访问外部函数(libc或第三方函数)(使用导入是一种通用解决方案)

我试图使用
emcc
将我的源代码编译成wasm,但是
malloc
free
在我的源代码中被广泛使用。我认为从现实世界导入
malloc
free
是不可行的

所以,我很好奇如何在wasm世界中实现
malloc
。我已经知道malloc在glibc中是如何工作的:使用brk()或sbrk()扩展堆,并对线性地址进行一些内存管理。但在wasm的世界里,我认为调用
brk()
sbrk()
来获取班机地址是不可能的

像这样使用全局var来实现
malloc
合理吗

u_char mem[10240];
void*wasm\u malloc(大小\u数量)
{
/*获得免费的memidx*/
返回&mem[idx];
}

等等,你不需要这样做

我不认为从现实世界中导入malloc和free是可行的

不对。这正是使用Emscripten的目的。Emscripten不仅仅是一个C/C++到Wasm的编译器,它还是一个完整的工具链,包括一个web运行时和它自己的libc,专门为web浏览器运行C/C++程序而设计,只需对源代码进行最小的修改

EmScriptenLibc是一个经过大量修改的分支。它实现/模拟了广泛的标准C库(包括
malloc
sbrk
)和POSIX API(如pthread和BSD socket),除了一些在Wasm环境中没有意义的API,如
exec
fork
。通过使用
emcc
命令,您可以直接链接这些libc端口。因此,只需使用
malloc
,您无需做任何事情

如果您仍然想知道如何为Emscripten实现
malloc
,Emscripten有-dlmalloc和emmalloc

是一个著名的malloc实现。glibc还使用了它的分叉版本。您可以看到Emscripten版本的dlmalloc

你可能对emmalloc更感兴趣。这是一个简单紧凑的malloc web环境实现,由Emscripten团队设计。您可以看到源代码