我在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. 您可以在客户端代码中使用Require功能吗?
- 2. 我可以使用宏代码中的Outlook加载宏吗?
- 3. base64编码中可能有空间吗?
- 4. C#使用密码互操作Excel宏 - 这有可能吗?
- 5. 在PCL XL中使用CMYK色彩空间可能吗?
- 6. 这可能使用JUnit吗?
- 7. 可能使用用户名/密码而不是客户端UI登录Facebook吗?
- 8. 使用可能的()/不可能的()预处理宏中的if-else如果链
- 9. 此代码可以使SQL注入变得不可能吗?
- 10. 用户工作空间太多会降低TFS性能吗?
- 11. 在mysql中替换不能使用可用空间。如何重命名可用空间?
- 12. C#和C++可以交互使用高性能代码吗?
- 13. 我可以使用Firebase云端功能隐藏JavaScript代码吗?
- 14. 我可以使用PHP反射来提取功能代码吗?
- 15. 可能在Android中使用空布局?
- 16. 使用CSS禁用onclick ::可能吗?
- 17. 在DNN Setting.ascx中使用FileUpload可能吗?
- 18. 可能在Java中使用YCbCr吗?
- 19. 使用css3居中投影,可能吗?
- 20. 在Pyqt中使用sqlchemy,有可能吗?
- 21. Arangodb:我可以从用户功能调用用户功能吗?
- 22. 当搜索栏使用太快时,MonoTouch.Dialog元素可能为空
- 23. 通用用户控件可能吗?
- 24. 不能使用可变
- 25. 无法运行宏SOLVER.XLAM!Main。宏可能不可用
- 26. 是否有可能使滚动条不占用空间?
- 27. 用户代码可以安全地使用struct padding吗?
- 28. 使用尽可能少的碎片回收分区中的可用空间
- 29. F#中可能会使用中间函数参数吗?
- 30. 你能用Adobe Air检查可用的硬盘空间吗?
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