boost::array
(или C ++ 0x std::array
) должно быть быстрее, чем std::vector
, потому что boost::array
экземпляры полностью находятся в стеке. Это означает, что boost::array
не имеет выделения кучи, а также означает, что он не может превышать размер, который вы указали для него при создании.
Цель boost::array
состоит в том, чтобы служить тонким слоем вокруг примитивных массивов, поэтому вы можете рассматривать их как стандартные контейнеры с .begin()
, .end()
и т. Д. Хорошие компиляторы должны устранять все издержки boost::array
, так что он работает идентично примитивным массивам.
Все это касается настройки «по умолчанию», когда у вас нет пользовательских распределителей, и вы измеряете простые вещи, такие как построение массива, доступ и модификация элементов. С другой стороны, все может измениться в других тестах, на других платформах или при умной настройке. Например,
- если вы создаете пользовательский распределитель, возможно, получая большой пул памяти при запуске программы, тогда создание или изменение размера
std::vector
могут быть не такими уж дорогими.
- Замена одного
std::vector
на другой - обычно очень быстрая операция; скорость обмена двух указателей. Обмен двух экземпляров boost::array
может быть намного дороже; в порядке копирования n
элементов. Но затем, в C ++ 0x, частью которого будет std::array
, замена двух массивов снова будет быстрой благодаря ссылкам на rvalue и их семантике перемещения.
- Копирование вектора может быть очень быстрой операцией; так же быстро, как копировать указатель (копировать при записи). Копирование
boost::array
может потребовать копирования каждого элемента массива. Опять же, иногда копирование любого объекта происходит очень быстро, даже быстрее, чем копирование указателя и даже в вашем компиляторе C ++ 03 - благодаря elision copy.
Вы можете профилировать, чтобы увидеть, что быстрее для вашего использования, но даже этот тест даст вам только представление о конкретной версии конкретного компилятора на конкретной платформе.