我感兴趣地阅读了帖子C difference between malloc and calloc。我在我的代码中使用malloc,想知道我将使用calloc有什么区别。
我现在的(伪)代码与malloc:
情景1
int main()
{
allocate large arrays with malloc
INITIALIZE ALL ARRAY ELEMENTS TO ZERO
for loop //say 1000 times
do something and write results to arrays
end for loop
FREE ARRAYS with free command
} //end main
如果我使用calloc而不是malloc,那么我将:
Scenario2
int main()
{
for loop //say 1000 times
ALLOCATION OF ARRAYS WITH CALLOC
do something and write results to arrays
FREE ARRAYS with free command
end for loop
} //end main
我有三个问题:
如果阵列非常大,哪个场景会更有效?
如果阵列非常大,哪个场景会更有时间效率?
在这两种情况下,我只是写入数组,因为对于for循环中的任何给定迭代,我都是从第一个元素到最后一个元素顺序编写每个数组。重要的问题:如果我在场景1中使用malloc,那么我是否有必要将元素初始化为零?用malloc说我有数组z = [garbage1,garbage2,garbage 3]。对于每次迭代,我按顺序编写元素,即在第一次迭代中我得到z = [some_result,garbage2,garbage3],在第二次迭代中我得到第一次迭代我得到z = [some_result,another_result,garbage3]等等on,然后我需要专门在malloc后初始化我的数组吗?
答案 0 :(得分:11)
假设在两个示例中初始化的内存总量相同,则使用calloc()
分配内存可能比使用malloc()
分配内存然后在单独的步骤中将其归零更快,尤其是在malloc()
情况下,通过在循环中迭代它们来单独归零元素。后跟malloc()
的{{1}}可能与memset()
一样快。
如果在将实际存储计算结果之前不关心数组元素是垃圾,则无需在calloc()
之后实际初始化数组。
答案 1 :(得分:1)
对于1和2,两者都做同样的事情:allocate和zero,然后使用数组。
对于3,如果你不需要先将数组归零,那么就不需要归零,而不是更快。
calloc的归零有可能比你编写的代码更有效,但与程序的其他工作相比,这种差异会很小。 calloc的真正节省不需要自己编写代码。
答案 2 :(得分:0)
calloc
和memset
方法应该大致相同,并且可能比自己归零更快。
无论如何,这都与您在主循环中所做的相关,这可能会大一些数量级。
答案 3 :(得分:0)
你在3.中陈述的观点似乎表明案件或不必要的初始化。这是非常糟糕的速度,不仅耗费时间浪费,而且因为它而发生了大量的缓存驱逐。
执行memset()
或bzero()
(无论如何都由calloc()
调用)是使大部分缓存无效的好方法。不要这样做,除非您确定不会覆盖所有内容,但可以读取未写入的缓冲区部分(如果0是可接受的默认值)。如果你无论如何你都写了所有意思,不要不必要地初始化你的记忆。
不必要的内存写入不仅会破坏您的应用程序性能,还会破坏与之共享相同CPU的所有应用程序的性能。
答案 4 :(得分:0)
我不知道Linux。但是在Windows上,有一个称为零页面线程的东西... calloc使用那些已经初始化为零的页面。 malloc和calloc的速度没有差别。
答案 5 :(得分:-1)
malloc比Calloc更快,因为malloc返回内存,因为它来自操作系统。但是当你调用Calloc时,它会从内核或操作系统获取内存,并使用零进行初始化,然后返回给你。 所以,初始化需要时间。这就是为什么malloc比Calloc更快的原因
答案 6 :(得分:-8)
malloc
因calloc
而有所不同
malloc接受一个参数,而calloc接受两个参数
malloc比calloc更快的原因是malloc将单维数组处理为指针格式,而calloc采用双维数组,在处理之前,它转换为单维数组,然后转换为指针格式。
我认为,这就是为什么malloc处理速度比calloc
更快的原因