amj*_*jad 3 c linux linux-kernel dynamic-memory-allocation
我们知道堆是一个零需求内存区域,它在未初始化的数据区域之后立即开始并向上增长(向更高的地址)。需求零是指CPU第一次接触堆区的虚拟页,对应的物理页全为零。
如果是这样,那么为什么有一个函数calloc用于将分配的内存初始化为零?如果访问时需求为零的页面已经为零,为什么需要再次将其初始化为零?
Jon*_*ler 10
因为在您使用空间并使用 释放它之后free(),它可能会再次分配。如果您不使用calloc(),则无法保证在第二次使用内存时将其归零。(调用free()不会将空间归零。)
calloc不一定必须自己将内存初始化为零。该说明的calloc说:
空间被初始化为所有位为零。
但它并没有说它就是calloc这样做的,只是通过某种机制将内存初始化为零。这不像 malloc:
- 该
malloc函数为size大小指定且值不确定的对象分配空间。
calloc保证了内存被归零,malloc确实不是。如果块的内容是写时复制零页,则calloc可能知道不会再次将其归零并且比malloc+快memset,因为memset不会知道内存已经归零(除非编译器将malloc+优化memset(..., 0, ...)为calloc);另一方面,如果块被重用,则calloc需要将其归零,即使调用者不关心归零,因此 amalloc会比calloc不需要归零的情况更快,因为calloc 那样确实会有效malloc+memset