2009-11-03 76 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

相关问题