2014-02-11 375 views
3
inline void myfunction(){ 
    //something here 
} 

void main(){ 
    void (*p)(void); 
    p = myfunction; 
    p(); 
} 

不同的编译器可以为此生成哪种机器码,以及在什么情况下?内联函数的函数指针C

+4

你的编译器肯定会令功能的非内联,但它也可以创建函数的两个verions,一个内联和一个非内嵌,都取决于你的编译器。 –

+1

@MichałWalenciak我的机器上只有gcc,我也问过其他的编译器。 – Heeryu

+2

@MichałWalenciak:测试只会告诉您您使用的C实现是否允许它。因为这可能是C实现特定的扩展,所以它不会告诉你它是否由C标准定义。 –

回答

3

由于您的编译器需要该函数的地址,因此它将生成目标代码的独立副本。

+2

如果该函数在文件中的其他位置使用,它也可能在该源文件中生成该函数的内联副本。 –

2

是 - 但它取决于你的编译器和它的设置将会出现什么副作用:

有不同的方法来定义内联函数;任何给定类型的定义都可能肯定会发出独立的对象代码,绝对不会发出独立的对象代码,或者只在已知需要时才发出独立的对象代码。有时,这会导致目标代码复制...

From Here