首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >为什么不调用free()来减小堆的大小呢?

为什么不调用free()来减小堆的大小呢?
EN

Stack Overflow用户
提问于 2011-06-17 23:18:27
回答 3查看 2.1K关注 0票数 3

我们知道当程序运行时,它的堆栈会变大或变小。在C程序中,当我们使用malloc()分配内存时,如果当前内存不足,它将调用sbrk()来扩展堆大小。当我们使用free()释放已分配的内存时,它不会缩小堆。为什么缩小堆没有意义呢?

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2011-06-17 23:22:03

堆栈不会收缩。您对堆栈的使用可能是可变的,但堆栈本身的大小通常保持不变。

您可以通过使用负参数调用sbrk来缩小堆,但我怀疑没有这样做的主要原因是因为进程可能在某个时候再次需要内存。当底层内存发生变化时,可能需要时间来调整malloc环境。

当你需要更多内存时,这没问题,你付出代价是因为你想要一些东西。但是你不想在释放内存时付出这样的代价,因为你不需要这样做。而且,如果你这样做了,那么再次需要那个内存,你就会不断地付出代价。想想这个循环:

代码语言:javascript
复制
for (int i = 0; i < 1000; i++) {
    char *m = malloc (1000000);
    free (m);
}

想想看,如果有了额外的负载,效率会有多低。

您可以将已释放但未释放回操作系统的内存视为您自己的个人内存缓存。

当然,这都是假设malloc使用了sbrk。由于逻辑和物理存储器之间的断开,现代操作系统可能提供更好的替代方案。

票数 6
EN

Stack Overflow用户

发布于 2011-06-17 23:25:32

当您请求内存时(例如使用malloc ),它有两个选择:

  • 如果它已经有足够的“预留”空间,它只是给你那个内存
  • ,如果没有,它会请求操作系统(使用一个系统调用)

当您free内存时,相同的机制会保留它,以防您稍后需要它。不断地通过请求内存/释放内存来困扰操作系统是不会有效率的。

显然,既然您正在谈论C,那么值得一提的是,任何标准都不会强制执行任何此类行为。

票数 1
EN

Stack Overflow用户

发布于 2011-06-17 23:25:31

一般来说,这些天来,首先使用sbrk()没有太大的意义。有关该函数的更深入讨论,请参阅this question

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

https://stackoverflow.com/questions/6387969

复制
相关文章

相似问题

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