VC++ 2005の最適化?

関数パラメタにオブジェクトインスタンスを値渡しする場合に、ユーザ定義のコピーコンストラクタがある場合とない場合で最適化?*1が行われて生成されるコードが違う事がある。
ユーザ定義のコピーコンストラクタが定義されている場合の方が生成される一時オブジェクトの数が少ない。

struct hoge1
{
	hoge1()	{ cout << "hoge1 ctor()" << endl ;}
	~hoge1(){ cout << "hoge1 dtor()" << endl ;}
} ;

struct hoge2
{
	hoge2()                 { cout << "hoge2 ctor()"      << endl ;}
	hoge2( const hoge2&obj ){ cout << "hoge2 copy ctor()" << endl ;}
	~hoge2()                { cout << "hoge2 dtor()"      << endl ;}
} ;

void func1( hoge1 obj )
{
	return ;
}

void func2( hoge2 obj )
{
	return ;
}

main()
{
	func1( hoge1() ) ;
	func2( hoge2() ) ;
}

実行結果
hoge1 ctor()
hoge1 dtor()
hoge1 dtor()
hoge2 ctor()
hoge2 dtor()

このコードを実行すると、hoge1のインスタンスは二つ生成される。たぶん、hoge1()とfunc1関数のパラメタobjの生成時。しかしhoge2のインスタンスは一つしか生成されない。
たぶん、func1()/func2()のパラメタ生成時に以下のようなコードが生成されてるのではないかと思ってみる。

  • ユーザ定義コピーコンストラクタなし。

 hoge1 tmp = hoge1() ; hoge1 obj = tmp ;

  • ユーザ定義のコピーコンストラクタあり。

 hoge2 obj = hoge2() ;

ユーザ定義のコピーコンストラクタの有無で変わる模様。VC++2005ではコピーコンストラクタはなるべく定義した方が効率が良くなるのかな。

*1:デバッグ版でかつ最適化オプションを無効にしていても同様の現象がおきるため最適化ではないのかも知れない