Примечание редактора:
Последующий вопрос с включенной оптимизацией, которая учитывает только цикл:
Почему итерация через` std :: vector` быстрее, чем итерация через `std :: array`?
где мы можем увидеть эффект сбои страницы ленивого выделения при чтении неинициализированной памяти BSS по сравнению с динамически выделенной + записанной памятью, которая инициализируется вне временного цикла.
Я пробовал профилировать этот код:
#include <vector>
#include <array>
#include <stdio.h>
using namespace std;
constexpr int n = 400'000'000;
//vector<int> v(n);
array<int, n> v;
int main()
{
int res = 0;
for(int x : v)
res += x;
printf("%d\n", res);
}
На моей машине версия array
быстрее, чем vector
.
Выделение памяти в этом случае не имеет значения, так как оно выполняется только один раз.
$ g++ arrVsVec.cpp -O3
$ time ./a.out
0
real 0m0,445s
user 0m0,203s
sys 0m0,238s
$ g++ arrVsVec.cpp -O3
$ time ./a.out
0
real 0m0,749s
user 0m0,273s
sys 0m0,476s
Я обнаружил, что разборка для std::vector
намного сложнее: https://godbolt.org/z/111L5G
std::array
бесплатно (занимает нулевое время). - person Galik   schedule 20.07.2019g++ -O3 arrVsVec.cpp
. Неоптимизированные тесты совершенно бесполезны - person M.M   schedule 20.07.2019reserve
в этом примере не имеет смысла, так как я уже выделяю всю память сразу - person tuket   schedule 20.07.2019