【问题标题】:What does this construct mean "__builtin_expect(!!(x), 1)" [duplicate]这个构造是什么意思“__builtin_expect(!!(x),1)”[重复]
【发布时间】: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,这更糟。

标签: c clang gnu


【解决方案1】:

!! 只是两个相邻的 ! 运算符。这是一种将任何非零值转换为 1 并保留 0 原样的简单方法。

【讨论】:

  • 因此,在示例中它是多余的(布尔上下文)。
  • 对于给定的__builtin_expect,这是必需的,因为它需要两个预期相等的值。如果只是if(x),那是的,那是多余的。
  • 对 Linux 内核的人说:stackoverflow.com/questions/109710/… 虽然看起来他们后来也添加了...
猜你喜欢
  • 2019-04-24
  • 2017-06-30
  • 1970-01-01
  • 1970-01-01
  • 2011-02-17
  • 2017-06-24
  • 1970-01-01
  • 1970-01-01
  • 2015-05-27
相关资源
最近更新 更多