2014-02-11 215 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