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

Это говорит здесь это

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

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

20
задан Peter Mortensen 27 August 2018 в 03:37
поделиться

3 ответа

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

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

Отсутствие последовательности как таковой не дает никакой эффективности.

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

12
ответ дан 30 November 2019 в 00:55
поделиться

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

0
ответ дан 30 November 2019 в 00:55
поделиться

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

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

13
ответ дан 30 November 2019 в 00:55
поделиться
Другие вопросы по тегам:

Похожие вопросы: