我看到一個奇怪的問題,如果我定義了析構函數,那麼成員方法沒有被內聯。定義析構函數可以防止成員函數被內聯
示例代碼:
#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 2012(v110)的發佈版本,但也嘗試過Visual Studio 2010(v100)。我試着設置/ Ob2來幫助說服它在沒有運氣的情況下內聯該方法。
我對程序集不夠熟悉,無法確切知道它正在嘗試做什麼,也許明天我會試圖弄明白,如果給出任何提示。任何人都可以闡明爲什麼定義一個空的析構函數會阻止該方法被內聯?
編輯[17/11/2012]我更新了上面的代碼要簡單得多(最初我正在處理我的Vector類)。
從成員方法返回一個原始類型似乎正確地內聯,這只是一個問題,當我返回我的類的一個實例。
我的解決方案有幫助嗎? –