Linux と Windows の両方でアプリを作成していますが、GCC ビルドがコピー コンストラクターへの無駄な呼び出しを大量に生成していることに気付きました。
この動作を生成するコードの例を次に示します。
struct A
{
A() { std::cout << "default" << std::endl; }
A(A&& rvalue) { std::cout << "move" << std::endl; }
A(const A& lvalue) { std::cout << "copy" << std::endl; }
A& operator =(A a) { std::cout << "assign" << std::endl; return *this; }
};
BOOST_AUTO_TEST_CASE(test_copy_semantics)
{
std::vector<A> vec_a( 3 );
}
このテストは、3 つの要素のベクトルを作成するだけです。左辺値がないため、3 つのデフォルト コンストラクター呼び出しと 0 コピーが必要A
です。
Visual C++ 2010 では、出力は次のようになります。
default
move
default
move
default
move
GCC 4.4.0 (MinGW) (-O2 -std=c++0x) では、出力は次のようになります。
default
copy
copy
copy
何が起こっていて、どうすれば修正できますか? コピーは実際のクラスに対して高価であり、デフォルトの構築と移動は安価です。