我在malloc上使用calloc有一点困惑。我记得在我读过的某处读到 calloc 比 malloc 慢,因为 calloc 在执行内存分配后执行初始化为零。
在我正在工作的项目中,我看到在 malloc 之后,他们为所有值分配零,如下所示,
str* strptr = (str*)malloc(sizeof(str));
memset(strptr,0,sizeof(str));
这里str是一个结构。
这类似于
str* strptr =(str*)calloc(1,sizeof(str));
我想知道使用 malloc 而不是 calloc 是否有任何优势,以及哪种方法更受欢迎。
我想知道使用 malloc 而不是 calloc 是否有任何优势
它们之间的区别只是
-
calloc
也采用对象计数,而不是只接受字节计数的malloc
-
calloc
零内存;malloc
使内存保持未初始化状态
因此,除了归零部分外,没有其他特殊优势。
首选哪种方法。
为什么不按照您正在查看的代码库使用malloc
方式呢?避免重复工作和代码;当 API 已经这样做时,为什么要重新发明轮子?您可能已经看到代码库具有一个实用程序函数,该实用程序函数就是这样做的:分配和零内存。这表明该代码段将被多次使用,因此他们将其包装在宏/函数中以从不同位置调用它。但是,当calloc
已经这样做时,为什么要这样做呢?
最好的代码是根本没有代码。代码越少越好,因此在这里你应该更喜欢calloc
而不是malloc
。也许优化器会在下面做同样的事情,但为什么要冒险呢?显然,优化器可能没有那么聪明,这就是这个问题的原因:为什么malloc + memset比calloc慢?
此外,calloc
路线需要较少的击键。