私はlinux &ウィンドウ用のアプリケーションを作成していますが、GCCビルドがコピーコンストラクタに大量の無駄な呼び出しを生成していることに気付きました。この試験は、わずか3つの要素のベクトルを作成標準ライブラリコンテナは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);
}
:
ここでこの動作を生成するためのコード例です。私はA
の値がないので、3つのデフォルトのコンストラクタ呼び出しと0のコピーを期待しています。ビジュアルC++ 2010
、出力される。
GCC 4.4.0(MinGWの)においてdefault
move
default
move
default
move
、(-O2 -std = C++ 0X)、出力は次のとおり
default
copy
copy
copy
何が起こっているのですか、どうすれば修正できますか?コピーは実際のクラスでは高価ですが、デフォルトの構築と移動は安いです。
「」ヘッダーを見ましたか?コンストラクタは何をしていますか? GCCの動作は、オブジェクトがデフォルトで構築されてからN回コピーされるC++ 03仕様と一貫しています。あなたのバージョンの標準ライブラリはC++ 0xに追加された新しいコンストラクタをサポートしていない可能性があります。デフォルトではN要素が構築されています。 –
この例ではC++ 0x言語機能が使用されているため、これはC++ 0x仕様ではなく、C++ 03仕様に関する質問であると仮定しています。 –
GCC 4.5と同じ出力 – tstenner