Если считается, что malloc () вызывает «грязную память», free () очищает ее? - PullRequest
0 голосов
/ 03 декабря 2011

Я слышал слухи, что вызов malloc приводит к так называемой «грязной памяти», которую вы можете увидеть в инструменте VM Tracker.

Теперь, слухи также говорят, что нужно стараться сохранить как можно меньше грязной памяти. Но о чем они мало говорили, так это о том, как снова сделать это грязным.

Иногда нет другого выбора, кроме как использовать malloc (). Черт, я люблю malloc (). Например, при создании аудиоисточников для OpenAL необходимо выполнить malloc () много данных.

Итак: когда мое приложение вызывает malloc () и free () повсюду, я всегда считал, что это нормально. У меня огромные проблемы при этом? Или free () всегда будет "очищать"? Я немного сбит с толку, потому что некоторые очень большие парни из очень большой компании предупреждают, что malloc () следует избегать как можно больше из-за этой проблемы с грязной памятью.

Может быть, кто-то может меня не запутать в этом.

Ответы [ 4 ]

3 голосов
/ 03 декабря 2011

Я серьезно сомневаюсь, что это правда. Все выделение памяти в Какао в конечном итоге осуществляется через malloc. скажем, рекомендации по использованию памяти от Apple. Цитата из этого документа:

Поскольку память является таким фундаментальным ресурсом, Mac OS X и iOS оба предоставить несколько способов выделить его. Какие методы распределения вы использование будет зависеть в основном от ваших потребностей, но в конце концов вся память выделения в конечном итоге используют библиотеку malloc для создания памяти. Даже объекты Какао в конечном итоге размещаются с использованием библиотеки malloc.

Я не знаю о ваших больших парнях в вашей большой компании, но я знал больших парней в больших компаниях, которые не знали сквота. Просто говорю'. Документация превосходит слухи каждый раз. :)

2 голосов
/ 03 декабря 2011

Я не знаю, что они подразумевают под "грязным" и "чистым". Возможно, они имеют в виду проблему фрагментации. Выполнение большого количества выделений и освобождений может вызвать проблемы фрагментации, но это действительно зависит от шаблонов использования и размеров блоков, которые вы выделяете. В общем, не беспокойтесь об использовании malloc и free. Если у вас есть реальная причина избежать стандартного распределителя, вы можете использовать свой собственный распределитель. Затем вы просто вызываете malloc один раз для огромного блока, который вы можете использовать в качестве основы для своего пользовательского распределителя.

1 голос
/ 03 декабря 2011

Если вы используете malloc и освобождаете блоки памяти одного и того же размера несколько раз, память будет использоваться повторно вместо накопления грязных страниц виртуальных машин. Так что это совершенно безопасно, если вы знаете максимум всех возможных размеров фрагментов, когда-либо выделенных вашим приложением в любое время, и это держит ваше приложение под пределом уничтожения ОС.

0 голосов
/ 03 декабря 2011

Вы правы - free () просто очистит его снова.

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