Предположим, у меня есть динамический массив, который я хочу отсортировать, я мог бы сделать
std::vector<int> v(100);
for (int i = 0; i < 100; i++) v[i] = rand();
std::sort(v.begin(), v.end());
но для критически важного для производительности кода накладные расходы на инициализацию неприемлемы, подробнее см. https://stackoverflow.com/a/7269088/3667089 а>
я тоже мог бы сделать
int *v = new int[100];
for (int i = 0; i < 100; i++) v[i] = rand();
std::sort(v, v + 100);
но необходимость управлять памятью связана с утечкой памяти в больших кодовых базах.
Таким образом, кажется, что наиболее осуществимый подход
std::unique_ptr<int[]> v(new int[100]);
for (int i = 0; i < 100; i++) v[i] = rand();
std::sort(v, v + 100);
Нет накладных расходов на инициализацию и не нужно беспокоиться об управлении памятью, но это возвращает длинную ошибку компиляции. Может ли кто-нибудь сообщить мне, что я делаю неправильно?
У меня Ubuntu 14.04, компилятор GCC.
РЕДАКТИРОВАТЬ: измените код, чтобы данные еще не были отсортированы
reserve(100)
. Также узким местом здесь может быть функцияrand()
. - person Galik   schedule 18.04.2016useVector
работает немного быстрее, чем useArray (с VC++ 2015), или с той же скоростью (с g++ 5.3). - person Jerry Coffin   schedule 18.04.2016Pixel
ничего не делает) и вопросом ОП (инициализация значенияint
выполняет нулевую инициализацию). - person Barry   schedule 18.04.2016int
, за исключением того, что инициализация значения - это nop, то это то, что он должен написать. - person Jerry Coffin   schedule 18.04.2016int
, я не могу найти никакой разницы, достаточно надежной, чтобы быть уверенным, что это реально. Быстрый тест с помощью gcc (например) показывает диапазон от 65 до 98 мс для массива и от 72 до 96 мс для вектора. Мне трудно оправдать исправление разницы, если так трудно даже быть уверенным, что она существует. Увеличение размера, похоже, тоже не помогает. - person Jerry Coffin   schedule 19.04.2016