16

我感兴趣地阅读了malloc 和 calloc 之间的 C 后差异。我在我的代码中使用 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

我有三个问题:

  1. 如果阵列非常大,哪种方案更有效?

  2. 如果阵列非常大,哪种方案更省时?

  3. 在这两种情况下,我只是写入数组,因为对于 for 循环中的任何给定迭代,我从第一个元素到最后一个元素按顺序写入每个数组。重要的问题:如果我在场景 1 中使用 malloc,那么是否有必要将元素初始化为零?用 malloc 说我有数组 z = [garbage1,garbage2,garbage 3]。对于每次迭代,我按顺序编写元素,即在第一次迭代中我得到 z =[some_result,garbage2,garbage3],在第二次迭代中,我在第一次迭代中得到 z =[some_result,another_result,garbage3] 等等on,那么我是否需要在 malloc 之后专门初始化我的数组?

4

7 回答 7

16

假设在您的两个示例中初始化的内存总量是相同的,分配内存calloc()可能比分配内存更快malloc(),然后在单独的步骤中将它们归零,特别是在malloc()您通过迭代将元素单独归零的情况下在他们身上循环。Amalloc()后跟 a 的memset()速度可能与calloc().

如果在实际将计算结果存储在其中之前不关心数组元素是垃圾,则无需在malloc().

于 2010-04-09T06:31:48.207 回答
1

对于 1 和 2,两者都做同样的事情:分配和归零,然后使用数组。

对于 3,如果您不需要先将数组归零,那么就不需要归零并且不这样做会更快。

calloc 的归零可能比您编写的代码更有效,但与程序所做的其他工作相比,这种差异会很小。calloc 真正节省的地方是不必自己编写代码。

于 2010-04-09T06:31:24.573 回答
0

和方法应该大致相同,calloc并且memset可能比自己归零快一点。

无论如何,这都与您在主循环中所做的事情有关,这可能要大几个数量级。

于 2010-04-09T11:38:33.127 回答
0

您在 3. 中陈述的观点似乎表明一个案例或不必要的初始化。这在速度方面是相当糟糕的,不仅浪费了这样做的时间,而且还因此发生了很多缓存驱逐。

执行memset()or bzero()calloc()无论如何都会调用)是使大部分缓存无效的好方法。除非您确定不会覆盖所有内容但可以读取尚未写入的缓冲区部分(就好像 0 是可接受的默认值一样),否则不要这样做。如果您无论如何都写了所有内容,请不要不必要地初始化您的内存。

不必要的内存写入不仅会破坏您的应用程序性能,还会破坏与其共享同一 CPU 的所有应用程序的性能。

于 2010-04-09T17:50:25.357 回答
0

我不知道Linux。但是在 Windows 上,有一种叫做零页面线程的东西...... calloc 使用那些已经初始化为零的页面。malloc 和 calloc 的速度没有区别。

于 2020-05-26T10:09:09.397 回答
0

malloc 比 Calloc 快,因为原因是 malloc 从操作系统返回内存。但是,当您调用 Calloc 时,它会从内核或操作系统获取内存,并以零初始化,然后返回给您。所以,初始化需要时间。这就是为什么 malloc 比 Calloc 快的原因

于 2018-05-31T09:26:35.207 回答
-7

malloc有两个不同的calloc原因

  1. malloc 接受一个参数,而 calloc 接受两个参数

  2. malloc 比 calloc 快的原因是 malloc 将一维数组处理为指针格式,而 calloc 采用二维数组,在处理之前它先转换为一维数组,然后再转换为指针格式。

我认为,这就是为什么 malloc 处理速度比 calloc 快的原因

于 2013-03-13T08:11:23.903 回答