4

私はこのコードを持っています

#include <iostream>
using namespace std;

class Test{
   public:
      int a;

      Test(int i=0):a(i){}
      ~Test(){
         cout << a << endl;
      }

      Test(const Test &){
         cout << "copy" << endl;
      }

      void operator=(const Test &){
         cout << "=" << endl;
      }

      Test operator+(Test& p){
         Test res(a+p.a);
         return res;
      }
};

int main (int argc, char const *argv[]){
   Test t1(10), t2(20);
   Test t3=t1+t2;
   return 0;
}

出力:

30
20
10

コピーコンストラクタがここで呼び出されないのはなぜですか?

4

3 に答える 3

11

これは、戻り値の最適化と呼ばれる特殊なケースであり、コンパイラーは一時的なものを最適化することができます。

于 2010-05-07T10:11:50.050 に答える
4

私はあなたがラインについて疑問に思っていると思いますTest t3=t1+t2;

コンパイラーは、コピー構造を最適化することができます。http://www.gotw.ca/gotw/001.htmを参照してください。

于 2010-05-07T10:11:11.207 に答える
4

他の人が言ったように、コピーコンストラクターへの呼び出しを最適化するだけです。ここでは、これらの最適化を無効にするとどうなりますか。

barricada ~$ g++ -o test test.cpp -O0 -fno-elide-constructors
barricada ~$ ./test
copy
30
copy
134515065
-1217015820
20
10
于 2010-05-07T10:14:05.650 に答える