在malloc或调用calloc之后初始化为零

时间:2014-12-08 09:18:50

标签: c malloc calloc

我在使用calloc而不是malloc时有一点困惑。我记得我读过的地方,calloc比malloc慢,因为calloc在执行内存分配后执行初始化为零。

在我正在工作的项目中,我看到在malloc之后他们为所有值分配零,如下所示,

str* strptr = (str*)malloc(sizeof(str));
memset(strptr,0,sizeof(str));

这里str是一种结构。

这类似于

str* strptr =(str*)calloc(1,sizeof(str));

我想知道使用malloc over calloc是否有任何优势以及首选哪种方法。

2 个答案:

答案 0 :(得分:3)

  

我想知道使用malloc over calloc是否有任何优势

它们之间的差异只是

  • calloc也会占用对象计数,而malloc只占用字节数
  • calloc零记忆; malloc使记忆未经初始化

除零点部分外没有其他特殊优势。

  

首选哪种方法。

为什么不在你正在查看的代码库中使用malloc的方式?避免重复工作和代码;当一个API已经这样做,为什么重新发明轮子?您可以看到具有实用程序功能的代码库,它只执行以下操作:allocate和zero memory。这表明该片段将被多次使用,因此它们将它包装在宏/函数中以从不同的地方调用它。但是,为什么calloc已经这样做呢?

The best code is no code at all.较少的代码更好,因此您应该优先calloc而不是malloc。可能是优化器会在下面做同样的事情,但为什么要抓住机会呢?显然,优化器可能不那么聪明,这就是这个问题的原因:Why malloc+memset is slower than calloc?

calloc路线也需要较少的击键次数。

答案 1 :(得分:-1)

calloc在“合适的边界”上对齐对象,而malloc则不对齐。例如,如果你有

typedef struct {
    char cc[2];
} t_test myVar;
myVar= calloc(32, sizeof(t_test));

它将分配32个元素,每个4字节(32位机器),因此每个t_test元素“适当对齐”。使用malloc:

myVar= malloc(32*sizeof(t_test));

可能没有这样的对齐。 (编译器可能有其他原因对齐或不对齐;这只是一个示例。)对齐可以加速程序/机器/内存,因为它只能获取单词而不需要对齐考虑到了。

注意:通过对malloc vs calloc的深入讨论,查看右侧列出的主题。实际上没有人提到我的论点是一个重要的方面。