2011-09-04 87 views
6
#include <stdlib.h> 

inline int f0(int a) { 
    return a*a; 
} 

inline int f1(int a) { 
    return a*a*a; 
} 

int main() { 
    int (*f)(int); 
    f = rand()%2 ? f0 : f1; 
    return f(rand()); 
} 

所以使用gcc,生成的asm文件是相同或不相同。它是否與任何帶有函數指針的代碼相同?通過函數指針使用的函數可以內聯嗎?

+1

請注意,包括gcc在內的大多數編譯器在決定是否插入內容時並不真正關心「內聯」。它肯定可以忽略它,如果'inline'的存在對決定這個啓發式的影響很大,我會感到驚訝。 – delnan

回答

6

函數指針不能內聯,除非它們的值在編譯時是完全可確定的。你的情況是不可判定的。

即使編譯器能夠看到函數指針中的哪個函數,大部分時間函數指針都不會內聯。

+1

我同意這一點。但是,'f0'和'f1' *可以在這裏內聯('if(rand%2){/ * code for f0 * /} else {/ * code for f1 * /}')。但我懷疑任何編譯器都會有一種啓發式的方法來發現這種事情。 –