emscripten - 如何在 Wasm 中实现 "malloc"

标签 emscripten webassembly

我在学习 WebAssembly现在,我发现 Wasm 世界无法轻松访问外部函数(libc 或第三方函数)(使用 import 是通用解决方案)。

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

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

使用全局var来实现malloc是否合理?像这样 ?

u_char mem[10240];


void *wasm_malloc(size_t num)
{
    /*get the free mem idx*/
    return &mem[idx];
}

最佳答案

等等,你不需要这样做。

I don't think that importing malloc and free from real world is practicable.


不正确。这正是使用 Emscripten 的重点。 Emscripten 不仅仅是一个 C/C++ 到 Wasm 的编译器,而是一个完整的工具链,其中包括一个 Web 运行时和它自己的 libc,专门设计用于以最少的源代码修改为 Web 浏览器运行 C/C++ 程序。
Emscripten libc 是 musl 的一个经过大量修改的分支.它实现/模拟了广泛的标准 C 库(包括 mallocsbrk )和 POSIX API(如 pthread 和 BSD 套接字),除了一些在 Wasm 环境中没有意义的 API,如 execfork .通过使用 emcc命令,您将开箱即用地链接这些 libc 端口。所以请随意使用 malloc - 你什么都不用做!
如果您仍然想知道如何实现 malloc对于 Emscripten,Emscripten 有 two options of malloc implementations - dlmalloc 和 emmalloc。
dlmalloc是一个著名的 malloc 实现。 glibc 也使用它的 fork 版本。可以看到 Emscripten 的 dlmalloc 版本 here .
emmalloc 可能对您更有趣。它是由 Emscripten 团队设计的用于 Web 环境的简单紧凑的 malloc 实现。可以查看源码here .

关于emscripten - 如何在 Wasm 中实现 "malloc",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57032577/

相关文章:

python - Heroku WebAssembly。运行 python 服务器

flutter - 如何在 Flutter Web 应用程序中包含 WebAssembly 模块?

javascript - 将 Emscripten 与 Fortran 一起使用 : LAPACK binding

javascript - 如何在 Web Worker 中使用 emscripted .js 库

javascript - 如何向 OpenCV.js 添加 `accumulateWeighted` 支持?

c - Web 程序集 - 类型错误 : NetworkError when attempting to fetch resource

python - 如何在浏览器中重定向/呈现 Pyodide 输出?

c++ - CImg 是否与 Emscripten 兼容

python - 与 Python 相比,如果用 C 编写,WebAssembly 运行得更快吗?

node.js - 使用 Node 调试 WebAssembly