3

したがって、これは GCC、CLANG、および MSVC で問題なくコンパイルされますが、異なる出力が得られます。

#include <iostream>
using namespace std;

class A {
 public:
    A() {
        cout << this << " def" << endl;
    }
    A(const A&) {
        cout << this << " copy" << endl;
    }
    A(A&&) {
        cout << this << " move" << endl;
    }
    A& operator= (const A&) {
        cout << this << " copy=" << endl;
        return *this;
    }
    A& operator= (A&&) {
        cout << this << " move=" << endl;
        return *this;
    }

    ~A() {
        cout << this << " ~A" << endl;
    }
};

A f() { 
    A a;
    return a; 
}

int main(){
    A a = f();
}

GCC および CLANG 出力の場合:

  • 0xbfad67cf デフ
  • 0xbfad67cf ~A

MSVC out は期待どおりですが (C++11 標準):

  • 0039FA3B デフ
  • 0039FA3B 移動
  • 0039FA3B ~A

そのため、MSVC でコンパイルされたコードはムーブ コンストラクターを呼び出しますが、GCC と CLANG ではムーブ コンストラクターは呼び出されません。最適化を無効にして試してみましたが、それでも同じ出力が得られます。さらに奇妙なのは、f() を A() を返すように変更すると、MSVC でもムーブ コンストラクターが呼び出されないことです。

コンパイラのバージョン:

  • gcc:バージョン 4.7.2 (GCC)
  • clang:バージョン 3.2 (tags/RELEASE_32/final) ターゲット: i386-pc-linux-gnu

プラットフォーム: Linux/ArchLinux

4

1 に答える 1

6

それが戻り値の最適化です

http://en.wikipedia.org/wiki/Return_value_optimization

コンパイラによって最適化された返されたオブジェクトは、削除されるよりもコピーされません

于 2013-03-27T16:51:52.490 に答える