Стек не сокращается.Ваше использование стека может быть переменным, но сам стек обычно остается постоянным по размеру.
И вы можете уменьшить кучу, вызвав sbrk
с отрицательным значениемаргумент, но я подозреваю, что основная причина, по которой это не сделано, заключается в том, что процессу может понадобиться память снова.При изменении базовой памяти может потребоваться время для настройки malloc
арен.
Когда вам нужно больше памяти, это нормально, вы платите цену, потому что чего-то хотите.Но вы не хотите платить эту цену при освобождении памяти, поскольку не нужно для.И если вы это сделали, то вам снова понадобилась эта память, вы бы постоянно платили за это.Подумайте о цикле:
for (int i = 0; i < 1000; i++) {
char *m = malloc (1000000);
free (m);
}
и подумайте о том, насколько более неэффективно это будет с дополнительной нагрузкой.
Вы можете думать о том, что память освобождена, но не возвращена обратно в операционную систему.как ваш личный кэш памяти.
Все это, конечно, предполагает, что malloc
использует sbrk
вообще.Современные операционные системы могут предоставить лучшие альтернативы из-за разрыва между логической и физической памятью.