2011-09-04 281 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 * /}')。但我怀疑任何编译器都会有一种启发式的方法来发现这种事情。 –