2010-05-01 115 views
1

請問這個代碼:內聯函數在其他內聯函數用C

inline int funcA(int a) __attribute__((always_inline)) 
{ 
    return a + 1; 
} 
inline int funcB(int b) __attribute__((always_inline)) 
{ 
    return funcA(b + 2); 
} 
int main() 
{ 
    return funcB(3); 
} 

轉化爲像這樣的代碼?:

int main() 
{ 
    return ((3) + 2) + 1; 
} 

GCC,ARM(iPhone)

回答

2

內聯函數調用不是語言需要編譯器執行的操作。這是一個實施質量問題(QoI)。但是任何GCC,MSVC和鏗鏘都會這樣做。當然,你必須啓用優化。

例如

# clang++ -cc1 -emit-llvm -O2 -o - main.cpp 
define i32 @main() nounwind readnone { 
entry: 
    ret i32 6 
} 
+0

我喜歡它實際上內聯,然後做了另一個通過,並評估常量......做得很好。 – 2013-04-16 23:43:20

0

有沒有保證當使用inline。它僅僅作爲編譯器的暗示(在許多(並非全部)案例中,與程序員相比,它們具有更多的啓發式和更好地理解內聯的影響)。

0

不一定。它取決於我猜測的編譯器和設置。事實上,在C++中,例如它甚至沒有保證,這

inline int funcA(int a) 
{ 
    return a + 1; 
} 
int main() 
{ 
    return funcA(3); 
} 

將得到改造成這個

int main() 
{ 
    return 3 + 1; 
} 

直列只是編譯器的提示。編譯器可以忽略它。

+1

但是你可以強制編譯器(GCC)去做:inline void foo(void)__attribute __((always_inline)); – tur1ng 2010-05-01 17:17:53