Предотвращение фрагментации памяти с новым - удалить трюк - PullRequest
4 голосов
/ 17 февраля 2011

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

int main()
{
 {
   char dummy* = new char[10000000];  // 10Mbytes ish
   delete[] dummy;
 }
 ...
}

Идея состоит в том, что дорогостоящей частью динамического выделения памяти является запрос на получение памяти из ОС, который обычно не возвращается до конца программы. Кто-нибудь использовал это и видел улучшения производительности?

Ответы [ 4 ]

4 голосов
/ 17 февраля 2011

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

Гораздо лучшая стратегия, как правило, состоит в том, чтобы распределять память в начале и повторно использовать выделенное пространство как можно раньше, прежде чем вернуть память в кучу. Это логика, лежащая в основе распределителей STL.

3 голосов
/ 17 февраля 2011

Это не имеет смысла. Вы выделяете огромный блок, затем освобождаете его, и куча становится владельцем памяти, занятой блоком, и может легально фрагментировать ее, пока она используется позже.

1 голос
/ 17 февраля 2011

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

1 голос
/ 17 февраля 2011

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

Возможно все что угодно.Это полностью зависит от реализации.Также он может даже вообще удалить код, поскольку ничего не делает.

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