Осуществляет ли free () дефрагментацию? - PullRequest
2 голосов
/ 05 августа 2009

Предполагая, что два блока, выделенных функцией malloc (), расположены рядом друг с другом (кто знает, что они следуют друг за другом? Просто предположение), после освобождения двух блоков они превращаются в один нераспределенный блок? Не уверен, пожалуйста, помогите. Спасибо.

Ответы [ 5 ]

12 голосов
/ 05 августа 2009

Это полностью зависит от реализации. Некоторые распределители действительно объединяются, некоторые - если выполняются определенные условия, некоторые - нет. Это не то, что вы можете принять в любом случае, хотя. Если это проблема, найдите решение, которое не зависит от такого предположения (например, управляйте фиксированным пулом самостоятельно).

3 голосов
/ 05 августа 2009

Это полностью зависит от реализации распределителя. Существует множество различных имплементаций, , некоторые из которых выполняют объединение смежной свободной памяти.

Редактировать: Вот исследовательский документ , в котором описаны различные методы распределения и оценки их влияния на фрагментацию. Я думаю, что их вывод заключается в том, что упорядоченные по адресу свободные списки блокировок (которые облегчают объединение) работают очень хорошо.

2 голосов
/ 05 августа 2009

Это (очень) зависит от реализации. Но если вы хотите что-то с этим сделать, это не free (), на которую вы должны смотреть, а malloc (). Старайтесь не выделять много маленьких блоков.

1 голос
/ 05 августа 2009

Я не думаю, что обычно используются алгоритмы, которые никогда не объединяют смежную память. Но есть алгоритмы, которые не делают этого, как только два свободных блока соседствуют, но требуют некоторых дополнительных условий. Два примера:

  • распределители, использующие разные области памяти в зависимости от запрашиваемого размера (например, которые используют специальную структуру данных для небольших блоков, чтобы у них было меньше служебных данных), часто не объединяют смежные блоки для некоторых размеров, даже если они используют более общий алгоритм для других размеров;

  • Распределители памяти друзей объединяют два блока, только если они являются друзьями.

0 голосов
/ 05 августа 2009

Нет гарантий, но многие распределители делают. Если у вас проблема с производительностью, связанная с памятью , вы получите более точные ответы, если вы зададите этот вопрос непосредственно . Существует множество методов улучшения производительности памяти на C-коде; это частое узкое место.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...