【发布时间】:2014-09-19 21:16:29
【问题描述】:
具体来说,我问的是双“!”在 __built_in 的参数中。
根据“C”语言,这是双重否定吗?
谢谢-
【问题讨论】:
-
它可用于将任何值转换为布尔值 0 或 1。例如。
!!(42) == 1 -
if(x)和if (__builtin_expect(!!(x), 1))应该在生成的代码中重现相同的顺序。写这篇文章的人做的过早优化是错误的。 -
@Havenard 实际上,它是对分支预测的优化。这是说
x很可能是非零,但也可能不是。如果它是经常检查的条件的一部分,则成功的分支预测带来的额外性能可能非常可观。 -
是的,但如果它可能不为零,那么
if(x)就足够了。从汇编的角度来看,唯一要做的是将x转换为test x,x之前的0 或1,而不是直接执行test x,x。甚至可能会诱使编译器改用cmp x,1,这更糟。