为什么要使用enif_alloc而不是malloc

4
为什么在尝试从Erlang C NIF中分配内存时,会使用void *enif_alloc(size_t size)而不是void *malloc(size_t size);?
参考资料没有明确说明原因。

http://www.erlang.org/doc/man/erl_nif.html#enif_alloc

我看到过使用malloc的NIF示例,但从未见过enif_alloc。它有什么不同?为什么最好使用它?


可能是在Erlang C NIF中分配内存的重复问题。 - Alok Save
1
看到他也是这个问题的 OP,真是令人震惊。http://stackoverflow.com/questions/14420970/allocating-memory-in-erlang-c-nif - sr01853
3
这是一个不同的问题,很少有可用的信息来拼凑答案。 - BAR
4
@Sibrajas那有什么问题呢?这不是重复的问题。最好每个问题写一个帖子,而不是在一篇帖子中写几个可能没有关联的问题。 - Lundin
1个回答

13

enif_alloc 使用内部 erlang 内存分配器,这意味着如果内部 VM 缓存中已经有可用的内存,则可以使用该内存,而不必进行系统调用以获取内存。在某些情况下,这可能会导致更快的内存分配,您将需要使用您的代码进行测量来确定是否有任何差异。总体而言,我建议使用 enif_alloc

如果我记得正确地使用 enif_alloc,则使用时所占用的内存也将包含在 issuing the erlang:memory 命令中。


1
完美的理由,正是我正在寻找的。那么你是如何知道这一点的呢?我可以在哪里学习呢? - BAR
2
这个特定的信息来自于阅读erts_alloc、erl_nif手册以及相应的源代码。你还需要理解内存分配器的一般工作原理 :) - Lukas

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接