我在Linux內核代碼中遇到了這兩個宏。我知道它們是分支情況下編譯器(gcc)優化的指令。我的問題是,我們可以在用戶空間代碼中使用這些宏嗎?它會給予任何優化?任何示例都會非常有幫助。用戶空間代碼中可能使用/不太可能使用宏嗎?
回答
是的,他們可以。 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
它一定會讓你的優化,如果你使用它的正確的分支預測。
在#else部分,他們不應該評估爲(x)而不是空的? – 2009-11-03 15:33:50
哎呀,當然可以。編輯 – Tomas 2009-11-03 15:35:43
哪個頭文件在用戶包含目錄中包含此定義? – 2009-11-03 15:40:05
的可能的(),並不太可能()宏在內核頭文件中定義的東西漂亮的名字是是真正gcc feature
在「6.2.2優化1級指令高速緩存訪問」一節中查看What Every Programmer Should Know About Memory - 有一個關於這一點的章節。
@Nikolai感謝您的鏈接。 – 2009-11-03 18:14:13
沒問題。這是一本非常有啓發性的論文,即使在第三次閱讀:) – 2009-11-03 18:31:34
- 1. 可能的和不太可能的宏
- 2. 您可以在客戶端代碼中使用Require功能嗎?
- 3. 我可以使用宏代碼中的Outlook加載宏嗎?
- 4. base64編碼中可能有空間嗎?
- 5. C#使用密碼互操作Excel宏 - 這有可能嗎?
- 6. 在PCL XL中使用CMYK色彩空間可能嗎?
- 7. 這可能使用JUnit嗎?
- 8. 可能使用用戶名/密碼而不是客戶端UI登錄Facebook嗎?
- 9. 使用__NR_in用戶空間代碼
- 10. 不能使用可空的DbGeography
- 11. 使用select而不listen()ing,可能嗎?
- 12. 的UITableViewCell的detailTextLabel不能使用所有可用空間
- 13. 是否有可能在用戶代碼中使用Java不安全?
- 14. 此代碼可以使SQL注入變得不可能嗎?
- 15. 使用可能的()/不可能的()預處理宏中的if-else如果鏈
- 16. 用戶工作空間太多會降低TFS性能嗎?
- 17. 我可以使用PHP反射來提取功能代碼嗎?
- 18. C#和C++可以交互使用高性能代碼嗎?
- 19. 我可以使用Firebase雲端功能隱藏JavaScript代碼嗎?
- 20. 在mysql中替換不能使用可用空間。如何重命名可用空間?
- 21. 可能在Android中使用空佈局?
- 22. 使用CSS禁用onclick ::可能嗎?
- 23. 可能在websphere 8.0中使用jdk1.7嗎?
- 24. 可能在Java中使用YCbCr嗎?
- 25. 使用css3居中投影,可能嗎?
- 26. 在Ruby TinyTDS中使用SSPI - 可能嗎?
- 27. 使用CGI中的Flask可能嗎?
- 28. 在DNN Setting.ascx中使用FileUpload可能嗎?
- 29. 在RenderAction中可能使用節嗎?
- 30. 在TortoiseHg中使用cygwin ssh.exe可能嗎?
http://kerneltrap.org/node/4705 – pmg 2009-11-03 15:29:18
重複? http://stackoverflow.com/questions/109710/rows-unlikely-macros-in-the-linux-kernel – 2009-11-03 15:34:10
我檢查了這些帖子,但都再次談論內核相關的東西。我想知道是否可以在用戶代碼中使用它。 – 2009-11-03 15:38:36