为什么不调用free()会减小堆的大小?

xia*_*ing 2 c memory-management

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

pax*_*blo 6

栈根本缩水.您对堆栈的使用可能是可变的,但堆栈本身通常保持不变.

并且您可以通过sbrk使用否定参数调用缩小堆,但我怀疑未完成的主要原因是因为进程可能在某个时刻需要再次使用内存.malloc当底层内存发生变化时,调整竞技场可能需要一些时间.

当你需要更多内存时,那很好,你需要付出代价,因为你需要一些东西.但是你不想在释放内存时支付这个价格,因为你不需要.并且,如果你这样做,那么再次需要那个记忆,你会不断付出代价.想想循环:

for (int i = 0; i < 1000; i++) {
    char *m = malloc (1000000);
    free (m);
}
Run Code Online (Sandbox Code Playgroud)

并考虑额外负载会产生多少低效率.

您可以将释放的内存视为您自己的个人内存缓存,但不会释放回操作系统.

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