0

コンパイラがどの程度最適化を行うのか気になるので...

// assume we have this declared somewhere
std::vector<int> vec;

// my question is, when fully optimized will this...
for (int i(0); i<100; ++i)
    vec.push_back(i);

// evaluate to this? psuedo code...
const size_t size = size();
const size_t newsize = size + 100;
if (size < vec.capacity())
    vec.exponentialGrowth();
vec.setSize(newsize);
for (size_t i(size); i<newsize; ++i)
    vector[i] = i;

最適化を有効にして Visual Studio Express 2012 を使用しています。逆アセンブルを見てみましたが、最適化により読みにくくなっています。

4

2 に答える 2

2

オプションを指定して VS 2012 によって生成されたアセンブリを見ると/Ox、コンパイラは 100 個の要素すべての容量を一度に予約するように最適化されていません。

要素を 1 つずつ追加し、追加のスペースが必要になると、ベクターの容量を 50% 増やします。ベクトルの容量は 0 から始まり、次のように大きくなります。

1, 2, 3, 4, 6, 9, 13, 19, 28, 42, 63, 94, 141 

GCC 4.7.2-O2も同様に動作しますが、容量が 50% ではなく 2 倍になります。

于 2012-12-03T08:40:37.310 に答える
0

std::vector、コンパイラの最適化がオンになっているかどうかに関係なく、指数関数的にサイズ変更されます。

サイズ変更のパフォーマンスが心配な場合 (およびreserve事前に十分なスペースがない場合) は、 の使用を検討してstd::dequeください。Herb Sutterの言葉を引用すると、「ベクターよりも deque の方が使いやすく、本質的に効率的に成長できます。」

于 2012-12-03T02:17:55.913 に答える