我正在阅读GCC手册 http://gcc.gnu.org/onlinedocs/gcc/Other-Builtins.html
我有关于builtin_expect
的以下问题long __builtin_expect(long exp,long c)
当类型应该是bool时,为什么是long类型的exp?
例如:内核定义了一个宏,用于将表达式转换为bool
定义可能的(x)__builtin_expect(!!(x),1)
那为什么不定义一个exp为bool而不是long的接口?
答案 0 :(得分:0)
__builtin_expect
会返回exp
的值,因此为了保持一致,它应该将其返回为与exp
相同的类型。
long
的选择(如果确实如此,并且文档不仅仅缺乏落后者)可能是历史性的。我对这种功能的期望是让表达式exp
在类型和值上完全不变。此功能只应通过提示编译器“注释”代码,而不是更改语义,例如exp
的类型为unsigned long
。
顺便说一下,内核宏中的表达式!!(x)
没有类型_Bool
,而是int
,这个例子只是exp
的特定用例只有两个结果。该功能本身比这更通用。