2012-09-26 28 views
-2

可能重複:
Inline functions vs Preprocessor macros
what is concept of Inline function and how it is differ from macro?在這種情況下,內聯函數的宏是什麼?

inline unsigned int getminutes(unsigned int seconds) 
{ 
    return(seconds/60); 
} 

#define GetMinutes(seconds) (seconds)/(60) 

說實話,我會問哪一個是更快,但我見過這麼多讓問哪一個更好會讓我知識。 (是的!我是一個知識獵人)

+5

請*充分*加上表達式宏(不只是宏參數)。這種錯誤是你應該傾向於內聯函數的一個原因...... –

+0

爲什麼你不學習基準測試? – netcoder

+0

@netcoder:嗯,他確實問過哪個更好,並說他*會問哪個更快,但沒有。 –

回答

4

切勿使用宏,如果你可以使用內聯函數來實現相同的。編譯器會產生準確兩個你所提供的解決方案相同的代碼,假設你使用的是相當不錯的一個。

當然不能保證內聯函數實際上會被內聯,但在這些情況下,如果你的編譯器不能內聯那個函數,那麼它可能是非常糟糕的。

只要不使用宏,除非你真的需要(標題守衛,做重複的東西等)。宏在很多方面都是邪惡的,如果你在網上搜索信息,你可以閱讀很多。

2

我猜如果你認爲inline沒有被編譯器保證使用,宏會更快。如果函數沒有內聯,那麼你有一個函數調用的開銷。

該宏將由預處理器擴展到位,因此它總是內聯。 該宏也不是類型安全的,並且具有全局範圍。

函數是優選的。

+1

範圍和類型? –

+0

@MooingDuck我編輯了我的答案 –

+1

如果編譯器太糟糕了,它不能內聯單線程,我們怎麼知道它沒有實現除法作爲'RTL_incredibly_slow_divide(秒,60)'的調用?然後宏也不會被內聯。 –

0

憑藉良好的優化編譯器的性能將是相同的。不同之處在於內聯函數或多或少是編譯器的一個建議。雖然編譯器應該在大多數情況下,兌現的建議,宏版本將編譯器內聯的代碼。

另外,您的宏應寫入((seconds)/60)以確保在所有情況下使用預期的分組。

0

不幸的是,這是更快是那些情況下知道的唯一途徑是個人資料之一。但是,我懷疑在典型的發行版本設置中結果是相同的。

這是更好,但是,我會說內聯函數。更易於調試。比宏觀更安全。

我避免,除非絕對必要的宏。我認爲它們是編譯時查找和替換的。我認爲在最壞的情況下,發現並替換爲極端危險。其實,我寫了一篇關於爲什麼我不喜歡#define宏如此強烈posttwo ......

另一個建議的話,我上運行:編譯比你懂得多。宏將強制內聯,即使它實際上對性能不利。inline將建議它作爲內聯的候選人,但如果內聯不符合標準,則可能不內聯。

相關問題