2013-02-11 42 views
0

我有一個模板參數T參數化的函數模板,給它不同的行爲,這取決於T它與實例化。所需的具體變化非常簡單,只需調用靜態函數T::foo(some_args)即可,因爲不涉及任何狀態。內聯和靜態函數調用運營商

但是我不想給foo出現在函數模板的身體。

我寧願稱之爲T(some_args);避免語法噪音。我相信聲明函數調用運算符()是靜態的是不可能的(或是否?)。 T沒有狀態,因此沒有實例特定的變量。

在事件上述是不可能的,什麼有更多的得到內聯的/優化(在G ++,鏘,ICC)機會

T::foo(some_args); // foo being a static function 

T()(some_args); // operator() declared inline 

我不知道組件檢查輸出結果,問題更多地來自學術/好奇心的觀點而不是實際表現。

是否真的T()(some_args)分配在運行時的對象?還是通常優化呢?

+0

嘗試在不同的優化級別,並查看生成的彙編代碼。它會告訴你對象創建是否已被優化。我的猜測不是,因爲你在一個實例上調用一個函數而不是一個靜態函數。 – 2013-02-11 08:43:05

+0

你問什麼似乎很奇怪。如果T作爲仿函數,'T'應該定義'operator()'。如果是這樣的話,只需將一個實例(即使是臨時的)傳遞給函數,就像普通的函數一樣。如果它不是函子,調用'foo'就沒有語法噪音。 – Alex 2013-02-11 08:46:09

+0

@JoachimPileborg正如我在我的問題中提到的,我不知道程序集來解決這個問題。所以任何簡單的演示都會很好。 – san 2013-02-11 08:46:24

回答

3

簡單的例子:

struct T 
{ 
    int operator()(int i) const { 
     return i+1; 
    } 
}; 

int main() 
{ 
    return T()(1); 
} 

與-02編譯,這將產生:

(gdb) disassemble main 
Dump of assembler code for function main(): 
    0x0000000000400400 <+0>:  mov eax,0x2 
    0x0000000000400405 <+5>:  ret 
End of assembler dump. 

即使-O0這不會創建一個臨時的情況下,你使用隱式默認構造函數在T:

(gdb) disassemble main 
Dump of assembler code for function main(): 
    0x00000000004004ec <+0>:  push rbp 
    0x00000000004004ed <+1>:  mov rbp,rsp 
    0x00000000004004f0 <+4>:  sub rsp,0x10 
    0x00000000004004f4 <+8>:  lea rax,[rbp-0x1] 
    0x00000000004004f8 <+12>: mov esi,0x1 
    0x00000000004004fd <+17>: mov rdi,rax 
    0x0000000000400500 <+20>: call 0x400508 <T::operator()(int) const> 
    0x0000000000400505 <+25>: leave 
    0x0000000000400506 <+26>: ret 
End of assembler dump. 
+0

非常感謝演示。 – san 2013-02-11 09:22:45