デストラクタを定義すると、メンバーごとのメソッドがインライン化されないという奇妙な問題が発生しています。
コード例:
#include <cstdio>
class Foo
{
public:
Foo(int arg) : data(arg) {}
~Foo(void) {}
Foo bar(void) const { return Foo(7); }
int data;
};
int main(void)
{
Foo a(3);
Foo b = a.bar();
printf ("%i", b.data);
}
デフォルトのデストラクタを使用すると、次のようになります。
main:
sub rsp,28h
lea rcx,[string "%i" (013FB8ADA0h)]
mov edx,7
call printf (013FB81068h)
xor eax,eax
add rsp,28h
ret
しかし、上記のコードのように、独自の空白のデストラクタを定義すると、次のようになります。
Foo::bar:
mov dword ptr [rdx],7
mov rax,rdx
ret
main:
sub rsp,28h
lea rdx,[b]
call Foo::bar (013FA11000h)
mov edx,dword ptr [b]
lea rcx,[string "%i" (013FA1ADA0h)]
call printf (013FA11088h)
xor eax,eax
add rsp,28h
ret
Visual Studio 2010(v100)も試しましたが、Visual Studio 2012(v110)を使用してリリースビルドとしてコンパイルされました。/ Ob2を設定して、運が悪かったのでメソッドをインライン化するように説得してみました。
私はアセンブリに精通していないので、アセンブリが何をしようとしているのかを正確に知ることはできません。おそらく明日、それを理解して、ヒントが得られるかどうかを確認しようと思います。空のデストラクタを定義するとメソッドがインライン化されなくなる理由を誰かが明らかにすることはできますか?
編集[2012年11月17日]上記のコードをはるかに単純になるように更新しました(元々はVectorクラスで作業していました)。
メンバーメソッドからプリミティブ型を返すと、正しくインライン化されるようです。これは、クラスのインスタンスを返す場合にのみ問題になります。