Стандарт C не заставляет исполнителя malloc
и free
напрямую возвращать память в ОС.Таким образом, различные реализации библиотеки C будут вести себя по-разному.Некоторые из них могут вернуть его напрямую, а некоторые нет.Фактически, одна и та же реализация также будет вести себя по-разному в зависимости от размеров и шаблонов выделения.
Такое поведение, конечно, по веским причинам:
- Это не всегда возможно.Распределение памяти на уровне операционной системы обычно выполняется в страницах (4 КБ, 4 МБ или ... размеры одновременно).И если небольшая часть страницы все еще используется после освобождения другой части, то страница не может быть возвращена операционной системе, пока эта часть также не будет освобождена.
- Эффективность.Весьма вероятно, что приложение снова запросит память.Так зачем возвращать его в ОС, а вскоре после этого попросить снова.(конечно, возможно существует ограничение на размер сохраняемой памяти.)
В большинстве случаев вы не несете ответственности за память, которую вы free
, если реализация решила сохранить ее (при условии, что это хорошая реализация).Рано или поздно он будет перераспределен или возвращен в ОС.Следовательно, оптимизация использования памяти должна основываться на количестве, которое у вас есть malloc
-ed, а у вас нет free
-d.В этом случае вам нужно беспокоиться, когда ваши шаблоны / размеры распределения начинают вызывать фрагментацию памяти, что само по себе является очень большой темой.
Если вы, тем не менее, находитесь во встроенной системе и объемеобъем доступной памяти ограничен, и вам нужно больше контролировать, когда и как память распределяется и освобождается, тогда вам нужно напрямую запрашивать страницы памяти у ОС и управлять ими вручную.
Редактировать: я не объяснил, почему выне несут ответственности за память вы свободны.Причина в том, что в современной ОС выделенная память является виртуальной.Это означает, что если вы выделите 512 МБ в 32-разрядной системе или 10 ТБ в 64-разрядной системе, если вы не читаете или не записываете в эту память, она не резервирует для нее никакого физического пространства.На самом деле, он зарезервирует физическую память только для страниц, к которым вы прикоснулись из этого большого блока, а не для всего блока.И через «некоторое время неиспользования этой памяти» ее содержимое будет скопировано на диск, а основная физическая память будет использована для чего-то другого.