クラスの値渡し、戻り値 その2

宣言時に初期化を行わないようにしたら、また動作が変わった。

#include <iostream>

using namespace std;

inline void debug(const char *s, long id) {
  cerr << s << ":" << id << endl;
}

class Foo {
private:
  int i;

public:
  Foo(int i) : i(i) { debug("Foo::Foo()", i); };
  ~Foo() { debug("Foo::~Foo()", i); };
};

Foo func(Foo foo) {
  Foo foo2(2);
  debug("in func()", (long) &foo2);
  return foo2;
}

int main() {
  Foo foo1(1), foo2(0);
  foo2 = func(foo1);
  debug("out func()", (long) &foo2);
  return 0;
}

g++


Foo::Foo():1
Foo::Foo():2
Foo::Foo():2
in func():2280608
Foo::~Foo():2
Foo::~Foo():1
out func():2280624
Foo::~Foo():2
Foo::~Foo():1

VC


Foo::Foo():1
Foo::Foo():0
Foo::Foo():2
in func():1244724
Foo::~Foo():2
Foo::~Foo():1
Foo::~Foo():2
out func():1245000
Foo::~Foo():2
Foo::~Foo():1
g++ 3.xだと一時オブジェクトは作成されないらしい…
ふむふむ。

追記
VCでも最適化を有効にしたら一時オブジェクトは作成されなかった。


Foo::Foo():1
Foo::Foo():0
Foo::Foo():2
in func():1245036
Foo::~Foo():1
Foo::~Foo():2
out func():1245032
Foo::~Foo():2
Foo::~Foo():1