这个构造是什么意思“__builtin_expect(!!(x), 1)”

use*_*339 1 c gcc gnu clang branch-prediction

具体来说,我问的是双“!” 在 __built_in 的参数中。

按照“C”语言,它是双重否定吗?

Dre*_*wen 5

!!只是两个!相邻的操作员。这是将任何非零值转换为1并保持0原样的简单方法。(又名“布尔化”值)。看!!c 运算符,是两个 NOT 吗?在 的上下文之外对一般逻辑运算符进行更多讨论__builtin_expect

为什么我们!!(x)想要__builtin_expect

我们想告诉编译器 很x可能是非零,而不是x很可能恰好是1x != 0这是告诉编译器期望与 之间的区别x == 1,这对于同一函数中的其他代码可能很重要。

我们同样可以写成__builtin_expect( (x)!=0, 1 ).

的第二个参数__builtin_expect是编译器应该期望第一个表达式等于的值。这不仅限于布尔值;请参阅GCC 的 __builtin_expect 能走多远?用于使用 0 或 1 以外的期望值。

  • 对于给定的“__builtin_expect”来说这是必要的,因为它需要两个预期相等的值。如果只是“if(x)”,那么是的,它是多余的。 (2认同)