我饶有兴趣地读了那篇文章。我在代码中使用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,那么我将拥有:
场景2
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=[一些结果,garbage2,garbage3],在第二次迭代中,我得到z=[一些结果,另一个结果,garbage3]等等,那么我是否需要在malloc之后专门初始化数组?
最佳答案
假设两个示例中初始化的内存总量相同,使用calloc()
分配内存可能比使用malloc()
分配内存然后在单独的步骤中将其归零更快,特别是在使用malloc()
的情况下,通过在循环中对元素进行迭代将其分别归零。amalloc()
后跟amemset()
的速度可能与calloc()
一样快。
如果在实际存储计算结果之前不关心数组元素是垃圾,那么就不需要在malloc()
之后实际初始化数组。