Я согласен с тем, что все уже сказали, но я хочу добавить лишь несколько поясняющих замечаний, касающихся os x:
Во-первых, операционная система фактически выделяет память, используя vm_allocate
, которая выделяет целые страницы за раз. Поскольку с этим связаны издержки, как заявляли другие, библиотека C не просто освобождает страницу, когда вы возвращаете память через free(3)
. В частности, если на странице памяти есть другие выделения, она не будет освобождена. В настоящее время страницы памяти имеют размер 4096 байт в mac os x. Количество байтов на странице может быть определено программно с помощью sysctl(2)
или, более просто, с помощью getpagesize(2)
. Вы можете использовать эту информацию для оптимизации использования памяти.
Во-вторых, приложения пользовательского пространства не связывают память. Обычно ядро связывает память для критических структур данных. Проводная память - это, по сути, память, которая никогда не может быть выгружена и никогда не вызовет ошибку страницы. Если по какой-либо причине на странице с проводной памятью возникнет сбой страницы, ядро запаникует, и ваш компьютер выйдет из строя. Если ваше приложение увеличивает проводную память вашего компьютера на заметную величину, это очень плохой признак. Как правило, это означает, что ваше приложение делает что-то, что значительно увеличивает структуры данных ядра, например, выделяет и не пожинает сотни потоков дочерних процессов. (конечно, это общее утверждение ... в некоторых случаях ожидается такой рост, например, при разработке виртуального хоста или чего-то подобного).