Чистый вектор на каждой итерации цикла. Какой самый эффективный способ памяти?

StackOverflow https://stackoverflow.com/questions/618169

Вопрос

У меня вопрос по поводу std :: vector.

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

Что из нижеперечисленного лучше:

for ( ... ) {
  std::vector<Type> my_vector;
  my_vector.reserve(stuff_count);
  // Do stuff , and append stuff to my_vector.
}

Или это:

std::vector my_vector;
for ( ... ) {
  my_vector.clear();
  my_vector.reserve(stuff_count);
  // Do stuff , and append stuff to my_vector.
}

Скажите, пожалуйста, какой из них лучше, или, если есть, лучший способ сделать что-нибудь.

Заранее большое спасибо!

Это было полезно?

Решение

В первом варианте вы перераспределяете буфер вектора на каждой итерации & # 8211; это обычно довольно дорого. Со вторым вариантом вы перераспределяете только изредка. Второй вариант лучше, так как скорость является для вас приоритетом.

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

Другие советы

  

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

Попробуй действовать как инженер, а не как гадалка. Создайте тест и измерьте разницу.

Второй может быть немного быстрее, но я нахожу первый чище.

Различия в коде тривиальны, почему бы не протестировать оба подхода и посмотреть, какой из них лучше всего подходит для вашего конкретного приложения?

Я бы сказал, что это зависит от того, как должен быть построен / уничтожен Type. Если это POD, который не требует уничтожения, вы можете пропустить clear (), которая вызывает все деструкторы в цикле, и использовать его вместо статического массива:

std::vector<Type> my_vector(size);
for (...)
{
  int index = 0;
  // Do stuff
  my_vector[index] = some_value;
}

(Предупреждение: код не проверен)

  

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

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

Если вам нужно выполнить много добавлений, используйте std :: deque вместо std :: vector и просто используйте " push_back ".

как насчет?

std::vector<DataType> my_vector;
my_vector.resize(sizeof(yourData));
memcpy(reinterpret_cast<char*>(&my_vector), &yourData, sizeof(yourData));
scroll top