我在使用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是否有任何优势以及首选哪种方法。
答案 0 :(得分:3)
我想知道使用malloc over calloc是否有任何优势
它们之间的差异只是
除零点部分外没有其他特殊优势。
首选哪种方法。
为什么不在你正在查看的代码库中使用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的深入讨论,查看右侧列出的主题。实际上没有人提到我的论点是一个重要的方面。