Стоимость выделения памяти [de] и потенциальные оптимизации компилятора (c ++) - PullRequest
6 голосов
/ 11 апреля 2011

Определена ли стоимость выделения памяти? Если стоимость зависит от того, какой конкретный компилятор используется, существует ли общий способ выделения памяти [de], чтобы я мог разумно предположить стоимость?

Может ли компилятор оптимизировать следующий код так, что вызов 'new' выполняется только один раз?

char * arr = NULL;
for (size_t i = 0; i < 5000000000; ++i)
{
    arr = new char[100000000]
    ... // Process things here
    delete []arr;
}

Ответы [ 3 ]

6 голосов
/ 11 апреля 2011

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

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

Нет стандартизированной стоимости для выделения / освобождения памяти. Как правило, время выделения / освобождения может сильно различаться (например, это займет значительно больше времени, если реализация кучи пользовательского пространства будет вынуждена получать свежие страницы из диспетчера памяти ядра ОС).

Правильное практическое правило заключается в том, что небольшие распределения, скорее всего, быстрее, чем большие, и распределения должны быть медленнее, чем удаление.

0 голосов
/ 11 апреля 2011

Время для выделения char [100000000] намного меньше, чем время для установки всех элементов в 0 (что конструктор должен делать в любом случае). И если ваш код записывает в каждую ячейку, выделение намного дешевле, чем что-либо еще.

И я не думаю, что есть компилятор, который делает это работающим и вызывает только конструктор.

0 голосов
/ 11 апреля 2011

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

Я бы выделил распределение и освобождение, потому что я не хочу полагаться на компилятор.

Кроме того, поскольку на стандартном языке C ++ сборка мусора отсутствует, ваше выделение и освобождение могут привести к разрушению фрагментированной памяти (или замедлить выполнение).

Кстати, вы по ошибке сравниваете переменную 'i', которая является целым числом, с величиной с плавающей запятой "5000000000.0". Обратите внимание на десятичную точку. Хорошей практикой программирования является сравнение целых чисел с целыми числами и с плавающей запятой с плавающей запятой.

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