Подтвердить что ты не робот

Почему unbounded_array более эффективен, чем вектор?

Здесь сказано, что

Неограниченный массив похож на std::vector в том, что в может расти в размер за пределы фиксированной границы. Однако unbounded_array нацелен на оптимальное представление. Поэтому unbounded_array не моделирует последовательность std::vector делает.

Что это значит?

4b9b3361

Ответ 1

Кажется, что не хватает методов insert и erase. Поскольку они могут быть "медленными", то есть их производительность зависит от size() в реализации vector, они были опущены, чтобы программатор не стрелял в ногу.

insert и erase требуются стандартом для контейнера, который будет называться Sequence, поэтому в отличие от vector, unbounded_array не является последовательностью.

Эффективность не достигается за счет того, что она не является последовательностью.

Однако он более эффективен в своей схеме распределения памяти, избегая понятия vector::capacity и всегда располагая выделенным блоком точно размер содержимого. Это уменьшает объект unbounded_array и делает блок в куче таким же большим, как и должен быть.

Ответ 2

Как разработчик Boost, я могу сказать вам, что совершенно правильно подвергать сомнению утверждения в документации; -)

Из чтения этих документов и чтения исходного кода (см. storage.hpp) Я могу сказать, что он несколько правилен, учитывая некоторые предположения относительно реализация std::vector во время написания кода. Этот код датируется 2000 годом и, возможно, уже в 2002 году. Это означает, что в то время многие реализации STD не помогли оптимизировать уничтожение и строительство объектов в контейнерах. Требование о безразмерности легко опровергается с использованием первоначально большого вектора емкости. Утверждение о скорости, я думаю, исходит полностью из того факта, что unbounded_array имеет специальный код для возврата dtors и ctors, когда хранимые объекты имеют тривиальные реализации из них. Следовательно, он может не называть их, когда он должен переупорядочить вещи, или когда он копирует элементы. По сравнению с действительно недавними реализациями STD это не будет быстрее, поскольку новая реализация STD, как правило, использует преимущества, такие как перемещение семантики, чтобы сделать еще больше оптимизаций.

Ответ 3

Как я понял из связанной документации, речь идет о стратегии распределения. std::vector afaik откладывает выделение до тех пор, пока не будет нужным, и может выделять некоторый разумный кусок меховых, unbounded_array швов, чтобы распределить больше памяти раньше, и поэтому он может выделяться реже. Но это всего лишь аргумент из документа в документации, что он выделяет больше памяти, чем может потребоваться, и что распределение более дорогое.