我们知道当程序运行时,它的堆栈会变大或变小。在C程序中,当我们使用malloc()分配内存时,如果当前内存不足,它将调用sbrk()来扩展堆大小。当我们使用free()释放已分配的内存时,它不会缩小堆。为什么缩小堆没有意义呢?
发布于 2011-06-17 23:22:03
堆栈不会收缩。您对堆栈的使用可能是可变的,但堆栈本身的大小通常保持不变。
您可以通过使用负参数调用sbrk来缩小堆,但我怀疑没有这样做的主要原因是因为进程可能在某个时候再次需要内存。当底层内存发生变化时,可能需要时间来调整malloc环境。
当你需要更多内存时,这没问题,你付出代价是因为你想要一些东西。但是你不想在释放内存时付出这样的代价,因为你不需要这样做。而且,如果你这样做了,那么再次需要那个内存,你就会不断地付出代价。想想这个循环:
for (int i = 0; i < 1000; i++) {
char *m = malloc (1000000);
free (m);
}想想看,如果有了额外的负载,效率会有多低。
您可以将已释放但未释放回操作系统的内存视为您自己的个人内存缓存。
当然,这都是假设malloc使用了sbrk。由于逻辑和物理存储器之间的断开,现代操作系统可能提供更好的替代方案。
发布于 2011-06-17 23:25:32
当您请求内存时(例如使用malloc ),它有两个选择:
当您free内存时,相同的机制会保留它,以防您稍后需要它。不断地通过请求内存/释放内存来困扰操作系统是不会有效率的。
显然,既然您正在谈论C,那么值得一提的是,任何标准都不会强制执行任何此类行为。
发布于 2011-06-17 23:25:31
一般来说,这些天来,首先使用sbrk()没有太大的意义。有关该函数的更深入讨论,请参阅this question。
https://stackoverflow.com/questions/6387969
复制相似问题