为什么使用 calloc 将分配的内存初始化为零?

amj*_*jad 3 c linux linux-kernel dynamic-memory-allocation

我们知道堆是一个零需求内存区域,它在未初始化的数据区域之后立即开始并向上增长(向更高的地址)。需求零是指CPU第一次接触堆区的虚拟页,对应的物理页全为零。

如果是这样,那么为什么有一个函数calloc用于将分配的内存初始化为零?如果访问时需求为零的页面已经为零,为什么需要再次将其初始化为零?

Jon*_*ler 10

因为在您使用空间并使用 释放它之后free(),它可能会再次分配。如果您不使用calloc(),则无法保证在第二次使用内存时将其归零。(调用free()不会将空间归零。)

  • 当你使用内存时,至少它的某些部分被更改为非零值。如果要用新数据覆盖内存,则不需要使用“calloc()”;使用 `malloc()` 就足够了。如果您需要将数据归零,那么“calloc()”可以尽可能高效地将其归零(或者更有可能的是,它可以比您更有效地完成此操作)。 (3认同)
  • @amjad:使用“calloc”正在履行程序员初始化内存的责任。 (2认同)

Ant*_*ala 7

calloc不一定必须自己将内存初始化为零。该说明calloc说:

空间被初始化为所有位为零。

但它并没有说它就是calloc这样做的,只是通过某种机制将内存初始化为零。这不像 malloc

  1. malloc函数为size大小指定且值不确定的对象分配空间

calloc保证了内存被归零,malloc确实不是。如果块的内容是写时复制零页,则calloc可能知道不会再次将其归零并且比malloc+快memset,因为memset不会知道内存已经归零(除非编译器将malloc+优化memset(..., 0, ...)calloc);另一方面,如果块被重用,则calloc需要将其归零,即使调用者不关心归零,因此 amalloc会比calloc不需要归零的情况更快,因为calloc 那样确实会有效malloc+memset