首先,模板包裝實例化的速度將是幾乎完全由您優化的擺佈。這就是說,我已經將你的示例縮減爲我能想到的最基本的代碼,特別是檢查函數參數的調用。你可以閱讀,但你會看到他們調用完全相同。一個聲明對另一個聲明沒有好處。此外,我包括你離開出一個,(參考DECL)
#include <cstdio>
int hello(int x)
{
return x;
}
template<typename Type>
void apply1(Type x, Type (f)(Type))
{
f(x);
}
template<typename Type>
void apply2(Type x, Type (*f)(Type))
{
f(x);
}
template<typename Type>
void apply3(Type x, Type (&f)(Type))
{
f(x);
}
int main(int argc, char *argv[])
{
apply1(1,hello);
apply2(2,hello);
apply3(3,hello);
return 0;
}
從扣除所產生的實際的asm是:
apply1
__Z6apply1IiEvT_PFS0_S0_E:
Leh_func_begin2:
pushq %rbp
Ltmp2:
movq %rsp, %rbp
Ltmp3:
subq $16, %rsp
Ltmp4:
movl %edi, -4(%rbp)
movq %rsi, -16(%rbp)
movq -16(%rbp), %rax
movl -4(%rbp), %ecx
movl %ecx, %edi
callq *%rax
addq $16, %rsp
popq %rbp
ret
Leh_func_end2:
apply2
__Z6apply2IiEvT_PFS0_S0_E:
Leh_func_begin3:
pushq %rbp
Ltmp5:
movq %rsp, %rbp
Ltmp6:
subq $16, %rsp
Ltmp7:
movl %edi, -4(%rbp)
movq %rsi, -16(%rbp)
movq -16(%rbp), %rax
movl -4(%rbp), %ecx
movl %ecx, %edi
callq *%rax
addq $16, %rsp
popq %rbp
ret
Leh_func_end3:
apply3
__Z6apply3IiEvT_RFS0_S0_E:
Leh_func_begin4:
pushq %rbp
Ltmp8:
movq %rsp, %rbp
Ltmp9:
subq $16, %rsp
Ltmp10:
movl %edi, -4(%rbp)
movq %rsi, -16(%rbp)
movq -16(%rbp), %rax
movl -4(%rbp), %ecx
movl %ecx, %edi
callq *%rax
addq $16, %rsp
popq %rbp
ret
Leh_func_end4:
他們相同(我懷疑他們會)。沒有什麼區別,我可以看到。
注:值得一提的方式編譯看到這些聲明的名字改編檢查:
apply1: __Z6apply1IiEvT_PFS0_S0_E
apply2: __Z6apply2IiEvT_PFS0_S0_E
apply3: __Z6apply3IiEvT_RFS0_S0_E
現在你的函數聲明不符合定義。你正在離開std :: vector參數。第二個聲明是唯一具有有效函數指針的聲明。 –
[函數指針](http://www.cprogramming.com/tutorial/function-pointers.html) –
好的,那麼爲什麼第一個版本在示例中編譯? – Vincent