2011-02-01 52 views
3

我需要使編譯器不內聯內聯函數。 例如:本地禁用函數內聯

我有一個內聯函數A

我有一個功能B,調用A
B,A被內聯,這是完美的。

現在我有一個功能C多次調用A
C,A被內聯,並且它不好。

是否可以告訴編譯器不會內聯一個當它從Ç叫什麼名字?

- 編輯 -

第一個想法是創建函數__declspec(noinline始終)A1(即簡單地調用)和呼叫A1代替Ç
但我想知道是否有更優雅的解決方案?


我知道直列只是一個建議,但在我的計劃,我有一些不太可能或錯誤的情況下,編譯器內聯函數,但不應該因爲在這些情況下,我更喜歡函數調用,以減少代碼大小。我還注意到,編譯器並不總是能夠做出最佳選擇(從開發人員的角度來看)

+0

您正在使用哪種編譯器?它們中的一些指定了讓你說該函數不應該內聯的編譯指示。 – 2011-02-01 12:00:49

+0

請注意,編譯器可能已經爲你做了這個。至少在C++中,「inline」關鍵字僅僅是編譯器的一個提示,如果編譯器認爲這是一個壞主意,編譯器可以決定不內聯。 – 2011-02-01 12:01:59

+3

如何通過函數指針調用它? – 2011-02-01 12:04:07

回答

1

我已經找到了以下解決方案:

template <class F> ALWAYS_INLINE F NOINLINE(F f) { 

    return f; 
} 

看來,編譯器(MSVC至少)沒有內聯函數調用是這樣的:

NOINLINE(my_inline_function)(); 

我認爲這是類似於「通過函數指針調用它」解決方案來自Nick D

0

最直接的解決方案是將函數代碼放入單獨的文件中。

7

通常,您不能告訴您的編譯器內聯或不內聯函數。這是一個內部優化,即使你聲明瞭一個函數內聯,編譯器可能會選擇不這樣做。

有些編譯器允許您在某種程度上控制內聯。例如,GCC有一個功能屬性noinline,它可以防止它被內聯。

在你的情況,我想嘗試這樣的事:

inline void a() { ... } 

void __attribute__((noinline)) wrap_a() 
{ a(); } 

void b() { a(); } 

void c() { wrap_a(); } 
4

內聯僅僅是一個建議,編譯器 - 這是很有可能的是,功能將不會在第二種情況下被粘貼。我只是相信編譯器並保持原樣。