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