我们知道堆是一个零需求内存区,它紧跟在未初始化的数据区之后,向上增长(朝向更高的地址)。所谓需求为零,是指CPU第一次接触堆区域中的虚拟页时,对应的物理页将全为零。
如果是这样的话,为什么会有一个函数calloc用于将分配的内存初始化为零?如果demand-zero页面在访问时已经是零,为什么还需要将它们初始化为零呢?
发布于 2020-09-22 14:54:55
因为在您使用该空间并使用free()释放它之后,它可能会再次被分配。如果不使用calloc(),就不能保证内存在第二次使用时会被清零。(调用free()不会将空间置零。)
发布于 2020-09-22 15:03:37
calloc不必自己将存储器初始化为零。calloc的description说:
空格被初始化为所有位0。
但它并没有说这是calloc做的,只是说内存是通过某种机制初始化为零的。这不同于malloc
malloc函数为对象分配空间,该对象的大小由size 指定,值为indeterminate.calloc保证内存归零,而malloc不保证。如果块的内容是写入时复制的零页,则calloc可能知道不再将其清零,并且比malloc + memset更快,因为memset不会知道内存已经清零(unless the compiler optimizes malloc + memset(..., 0, ...) to calloc);另一方面,如果块被重用,则calloc需要将其清零,即使调用者不关心清零,因此如果不需要清零,则malloc将比calloc更快,因为这样calloc确实可以有效地执行<代码>D30+<代码>D31
发布于 2020-09-22 15:17:15
简而言之,如果您的应用程序需要显式地将内存设置为零,那么将其显式设置为零更便于移植;如果应用程序不需要显式地将内存设置为零,则更快。您不必使用calloc()来获取归零的内存--您可以只使用malloc()并自己将其置零(例如,使用memset)。但是,如果calloc()能够利用特定于平台的特性来获得它,那么它会更快地为您提供零内存。
https://stackoverflow.com/questions/64004465
复制相似问题