什么时候应该使用malloc而不是zmalloc?

9

在网上或stackoverflow上关于我最近遇到的一个名为zmalloc的函数,几乎没有什么信息。(事实上,这是SO上唯一的第三个标记为zmalloc的问题)。

我得到了以下信息:

所以我的问题是:

  1. 使用zmalloc而不是malloc会失去哪些灵活性?也就是说,malloc继续提供了哪些zmalloc没有的好处?
  2. zmalloc在C11中是否非标准?这是一个自定义的函数吗?
1个回答

14

看起来zmalloc是redis-tools(https://github.com/antirez/redis-tools)的一部分。redis是一种将数据存储在内存中的数据库(http://redis.io/)。

一般来说,malloc替代品是由于某些目标系统没有提供合适的malloc,或者调用者需要额外的功能而开发的。我认为zmalloc只是一个相当简单的系统malloc/free的包装器,只会跟踪总的分配内存,没有自动释放。您指出的帖子还解释了需要:可以配置数据库不使用超过某些内存量,因此需要跟踪总体消耗。


谢谢Peter,根据stackoverflow标签描述,它会自动释放...那么你认为这个标签是错误的吗? - Engineer
1
是的,标签维基是错误的。我已经提出了一个编辑来修复它。顺便说一下,zmalloc()不是我迄今为止见过的最好的编写代码,它比必要的添加了更多的开销。当然,这种开销被malloc()本身的开销所淹没,但是,像那样的代码应该由知道如何优化的人编写... - cmaster - reinstate monica
1
@cMaster:有什么具体的地方让你觉得不够优秀吗? - Peter - Reinstate Monica
7
a) 在主执行路径中使用 if 进行向上舍入到二的幂,而不仅仅是直接执行 rounded = (unrounded + n-1) & ~(n-1);。如果预测错误,if 会刷新整个流水线,而算术运算只需要两个简单的指令。 b) 使用舍入本身就是不必要的,只会浪费时间。 c) 在 zrealloc() 中分两步执行大小校正。 d) 对于已经保证无缓冲的 stderr 执行完全没有意义的 flush()。当然,该刷新从未被执行过,但仍然存在。 - cmaster - reinstate monica
3
@cmaster,你曾经向Antirez提起过这个吗? - philraj

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