2009-11-03 71 views
22

我在Linux內核代碼中遇到了這兩個宏。我知道它們是分支情況下編譯器(gcc)優化的指令。我的問題是,我們可以在用戶空間代碼中使用這些宏嗎?它會給予任何優化?任何示例都會非常有幫助。用戶空間代碼中可能使用/不太可能使用宏嗎?

+0

http://kerneltrap.org/node/4705 – pmg 2009-11-03 15:29:18

+0

重複? http://stackoverflow.com/questions/109710/rows-unlikely-macros-in-the-linux-kernel – 2009-11-03 15:34:10

+0

我檢查了這些帖子,但都再次談論內核相關的東西。我想知道是否可以在用戶代碼中使用它。 – 2009-11-03 15:38:36

回答

40

是的,他們可以。 In the Linux kernel,它們被定義爲

#define likely(x)  __builtin_expect(!!(x), 1) 
#define unlikely(x)  __builtin_expect(!!(x), 0) 

的__builtin_expect宏是使用分支預測GCC特定宏;他們告訴處理器一個條件是否可能是真實的,以便處理器可以在分支的正確「一側」預取指令。

你應該換行定義一個IFDEF,以確保其它編譯器編譯:

#ifdef __GNUC__ 
#define likely(x)  __builtin_expect(!!(x), 1) 
#define unlikely(x)  __builtin_expect(!!(x), 0) 
#else 
#define likely(x)  (x) 
#define unlikely(x)  (x) 
#endif 

它一定會讓你的優化,如果你使用它的正確的分支預測。

+1

在#else部分,他們不應該評估爲(x)而不是空的? – 2009-11-03 15:33:50

+1

哎呀,當然可以。編輯 – Tomas 2009-11-03 15:35:43

+0

哪個頭文件在用戶包含目錄中包含此定義? – 2009-11-03 15:40:05

4

的可能的(),並不太可能()宏在內核頭文件中定義的東西漂亮的名字是真正gcc feature

9

在「6.2.2優化1級指令高速緩存訪​​問」一節中查看What Every Programmer Should Know About Memory - 有一個關於這一點的章節。

+0

@Nikolai感謝您的鏈接。 – 2009-11-03 18:14:13

+0

沒問題。這是一本非常有啓發性的論文,即使在第三次閱讀:) – 2009-11-03 18:31:34

相關問題