首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >为什么使用calloc将分配的内存初始化为零?

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

Stack Overflow用户
提问于 2020-09-22 14:52:09
回答 5查看 686关注 0票数 3

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

如果是这样的话,为什么会有一个函数calloc用于将分配的内存初始化为零?如果demand-zero页面在访问时已经是零,为什么还需要将它们初始化为零呢?

EN

回答 5

Stack Overflow用户

发布于 2020-09-22 14:54:55

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

票数 10
EN

Stack Overflow用户

发布于 2020-09-22 15:03:37

calloc不必自己将存储器初始化为零。calloc的description说:

空格被初始化为所有位0。

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

  1. malloc函数为对象分配空间,该对象的大小由size 指定,值为indeterminate.

calloc保证内存归零,而malloc不保证。如果块的内容是写入时复制的零页,则calloc可能知道不再将其清零,并且比malloc + memset更快,因为memset不会知道内存已经清零(unless the compiler optimizes malloc + memset(..., 0, ...) to calloc);另一方面,如果块被重用,则calloc需要将其清零,即使调用者不关心清零,因此如果不需要清零,则malloc将比calloc更快,因为这样calloc确实可以有效地执行<代码>D30+<代码>D31

票数 7
EN

Stack Overflow用户

发布于 2020-09-22 15:17:15

简而言之,如果您的应用程序需要显式地将内存设置为零,那么将其显式设置为零更便于移植;如果应用程序不需要显式地将内存设置为零,则更快。您不必使用calloc()来获取归零的内存--您可以只使用malloc()并自己将其置零(例如,使用memset)。但是,如果calloc()能够利用特定于平台的特性来获得它,那么它会更快地为您提供零内存。

票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/64004465

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档