Неограниченный массив подобен станд.:: вектор в этом в может увеличиться в размере вне любого зафиксированного связанный. Однако unbounded_array нацелен на оптимальную производительность. Поэтому unbounded_array не моделирует Последовательность как станд.:: вектор делает.
Что это означает?
Похоже, отсутствуют методы insert
и erase
. Поскольку они могут быть "медленными", т.е. их производительность зависит от size ()
в реализации вектора
, они были опущены, чтобы программист не выстрелил себе в ногу.
insert
и erase
требуются стандартом для того, чтобы контейнер назывался последовательностью, поэтому в отличие от вектора
, unbounded_array
не является последовательностью .
Отсутствие последовательности как таковой не дает никакой эффективности.
Однако он более эффективен в своей схеме распределения памяти, поскольку избегает концепции vector :: capacity
и всегда имеет выделенный блок точно такого же размера, как контент. Это делает объект unbounded_array
меньше и делает блок в куче ровно настолько большим, насколько он должен быть.
Как я понял из связанной документации, все дело в стратегии распределения. std :: vector afaik откладывает выделение до тех пор, пока это необходимо, и тогда может быть выделен некоторый разумный кусок швов meory, unbounded_array для раннего выделения большего объема памяти и, следовательно, может выделяться реже. Но это только предположение из заявления в документации, что он выделяет больше памяти, чем может потребоваться, и что выделение более дорогое.
Как разработчик Boost, я могу сказать вам, что совершенно нормально подвергать сомнению утверждения в документации; -)
Прочитав эти документы и прочитав исходный код (см. storage.hpp ), я могу сказать, что это несколько правильно, учитывая некоторые предположения о реализации std :: vector на момент написания кода. Первоначально этот код датируется 2000 годом, а, возможно, и последним в 2002 году. Это означает, что в то время многие реализации STD плохо справлялись с оптимизацией разрушения и построения объектов в контейнерах. Утверждение о том, что размер не изменяется, легко опровергнуть, если использовать изначально большой вектор емкости. Утверждение о скорости, я думаю, полностью исходит из того факта, что unbounded_array имеет специальный код для исключения dtors и ctors, когда хранимые объекты имеют их тривиальные реализации. Следовательно, он может не вызывать их, когда ему нужно переставлять вещи или когда он копирует элементы. По сравнению с действительно недавними реализациями STD это не будет быстрее, поскольку новые реализации STD, как правило, используют такие вещи, как семантика перемещения, для еще большей оптимизации.