Почему я не должен использовать вектор>? - PullRequest
4 голосов
/ 04 февраля 2012

Я только что прочитал вопрос об инициализации многомерных векторов ( вопрос ), и Виктор Сехр и Сби рекомендовали вместо этого использовать один вектор и получить элемент с my_vector[x+y*100+z*100*100]. Почему это? Это из соображений производительности? Если так, как это улучшает производительность? Заранее спасибо, эл.

Редактировать: Эти причины все еще применяются, когда ширина / высота / глубина не совпадают и могут измениться?

Ответы [ 4 ]

8 голосов
/ 04 февраля 2012

Всего несколько причин:

Это пустая трата времени, он медленный (непредсказуемый доступ к памяти, потеря кеша и т. Д.), Он громоздкий

Основным недостатком производительности, вероятно, является кэширование. С плоскими массивами вы гарантированно сохраняете непрерывную память - кеш счастлив. С вектором векторов - кто знает!

4 голосов
/ 04 февраля 2012

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

Вам следует взглянуть на Boost.MultiArray , который дает вам лучшее из обоих миров.

Если по какой-либо причине вы не можете использовать Boost, я определенно typedef it:

typedef vector<vector<vector<int> > > My3DIntVector;

My3DIntVector v;
2 голосов
/ 04 февраля 2012

… Виктор Сер и Sbi рекомендовали вместо этого использовать один вектор и получить элемент с помощью my_vector [x + y * 100 + z * 100 * 100].Почему это так?

Учитывая размеры, это логическая рекомендация , если размеры фиксированы .

Это из соображений производительности?Если да, то как это повышает производительность?

Рассмотрим:

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

Редактировать: Эти причины все еще применяются, когда ширина / высота / глубина не совпадают и могут изменяться?

Изменение размера этого (массивного!) Массива может быть очень медленным.Вы должны понимать, как ваша программа будет работать, если вы хотите, чтобы она была самой быстрой.Сложность копирования и уничтожения элементов также учитывается (при использовании чего-то более сложного, чем int).Если вы выполняете много операций изменения размера или вставки / удаления, то плоский вектор может быть очень медленным.

Однако, если его размеры фиксированы, вы можете сделать много лучше чем std::vector.std::array является одной альтернативой.(Если вы идете по маршруту std::array, будьте осторожны с тем, что вы выделяете в стеке)

0 голосов
/ 04 февраля 2012

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

A vector<vector<vector<int> > > содержит много фрагментов памяти: блок для первого вектора, блок для каждого элемента в vector<> и блок для каждого элемента в vector<vector<>>. Это нелегко кешировать и может привести к едва предсказуемому использованию памяти.

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