1

値によってオブジェクトを返す関数を使用してコピー コンストラクターの動作をテストしたところ、コピー コンストラクターが呼び出されるケースと呼び出されないケースに遭遇しました。

次のコードを検討してください。

class A {
public:
    A() {}
    A(const A& a) {
        cout << "Copy CTOR: " << "This address is " << this 
             << " input address is "<< &a <<       "\n";
    }
};

A returnMyself(A& a) {
    cout<<"Myself address is: "<< &a << "\n";
    return a;
}

A returnLocal(A& a) {
    A local;
    cout<<"local address in returnLocal is  "<< &local << "\n";
    return local;
}

int main () {
    A a;
    cout<<"Before returnMyself\n";
    returnMyself(a);
    cout<<"After returnMyself\n\n";

    cout<<"Before returnLocal\n";
    returnLocal(a);
    cout<<"After returnLocal\n";
}

の出力mainは次のとおりです。

戻る前の自分。
自分のアドレスは 0x7fff6afd88f0 です。
コピー CTOR 呼び出し: このアドレスは 0x7fff6afd88d8 です。入力アドレスは 0x7fff6afd88f0 です。
帰ったら自分。

returnLocal の前に。
returnLocal のローカル アドレスは 0x7fff6afd88d0 です。
リターンローカルの後。

ご覧のとおり、ローカル オブジェクトを宣言してそれを返すと、コピー コンストラクターを呼び出す特定の参照オブジェクトを返すのとは対照的に、コピー コンストラクターは呼び出されません。

誰もこれについて説明がありますか?一般に、値によって返される関数からコピー コンストラクターを呼び出す場合はどのような場合ですか?

ありがとう!

4

1 に答える 1

2

これはコピー省略です。コンパイラは、そのコピーを最適化するのに十分賢いです。

于 2012-06-30T21:20:23.920 に答える