我在標準化循環緩衝區時偶然發現了這個問題。任何人都可以解釋一個std :: vector在這個例子中如何超越一個普通數組?std :: vector如何比普通數組更快?
#include <iostream>
#include <vector>
struct uint_pair {
unsigned int a, b;
uint_pair (unsigned int x = 0, unsigned int y = 0) : a(x), b(y) {}
};
struct container {
unsigned int pos;
#ifdef USE_VECTOR
std::vector<uint_pair> data;
container() : pos(0) { data.resize(16); }
#else
uint_pair data[16];
container() : pos(0) {}
#endif
void add(uint_pair val) {
data[++pos % 16] = val;
}
};
int main() {
container c;
for (unsigned int i = 0; i < 1000000000; i++) c.add(uint_pair{i, i});
std::cout << c.data[0].a << " " << c.data[0].b << std::endl;
}
這是我使用的GCC(鏗鏘類似)得到的結果:
g++ -o bench -std=c++0x -Os main.cpp -D'USE_VECTOR'
real 0m8.757s
user 0m8.750s
sys 0m0.002s
g++ -o bench -std=c++0x -Os main.cpp
real 0m9.215s
user 0m9.209s
sys 0m0.002s
可能只是分配排隊與高速緩存的其他數據的方式。附:你想調整大小而不是保留。 – 2014-10-04 04:17:49
@MarkRansom謝謝,更新了代碼。結果仍然成立。 – amarcus 2014-10-04 04:21:47
GCC 4.8帶來更大的差異。我看到0.6s的矢量和1.8s的陣列。優化級別很重要,-O3獲得矢量的0.9s。 – Adam 2014-10-04 04:27:49