【问题标题】:Why doesn't the bitwise & operator short-circuit?为什么按位 & 运算符不短路?
【发布时间】:2012-03-13 16:46:04
【问题描述】:

我们都知道,如果左操作数是false,逻辑运算符&&会短路,因为我们知道如果一个操作数是false,那么结果也是false

为什么按位& 运算符也不会短路?如果左操作数是0,那么我们知道结果也是0。我在(C、Javascript、C#)中测试过的每种语言都会评估两个操作数,而不是在第一个操作数之后停止。

有什么理由让& 运算符短路是个坏主意吗?如果不是,为什么大多数语言不把它变成short-cicuit?这似乎是一个明显的优化。

【问题讨论】:

  • 一个原因是考虑到函数调用的副作用。
  • 由于位运算符通常用于整数操作数的按位运算(并且通常对应于单个机器指令),因此除了引入一个额外的条件来检查罕见0例。为什么乘法不会在0上短路?好吧,因为它是对应于单个机器指令的简单算术运算,并且检查没有人会检查每个乘法运算是否为 0。
  • 如果左操作数是0xFFFFFFFF,则按位| 运算符可能会短路。

标签: language-agnostic bit-manipulation


【解决方案1】:

我猜这是因为源语言中的按位and 通常会被相当直接地翻译成由处理器执行的按位and 指令。这反过来又在硬件中实现为一组适当数量的and 门。

在大多数情况下,我认为这不会优化任何东西。评估第二个操作数的成本通常低于测试是否应该评估它的成本。

【讨论】:

  • 如果第二个操作数涉及昂贵的计算,将会受益。
  • @PeterOlson 是的,只有在极少数情况下,左操作数是 0。请记住,我们在这里讨论的是整数,整数值 0 比布尔值 false 少得多(即使可能比其他数字更频繁)。
【解决方案2】:

短路不是优化设备。它是一种控制流设备。如果你没有短路p != NULL && *p != 0,你不会得到一个稍微慢一点的程序,你会得到一个崩溃的程序。

这种短路对位运算符几乎没有意义,比普通的非短路运算符更昂贵。

【讨论】:

  • 这个论点对我来说似乎倒退了。短路可以用作流量控制设备因为它作为优化存在。如果&& 没有短路,那么这样的代码将永远不会有效编写;它必须是两个单独的测试。但是,我同意按位短路在实践中非常罕见,从长远来看它可能会更昂贵。这完全取决于调用代码上下文中左操作数为 0 值的可能性。
  • @QuinnTaylor 优化,顾名思义,只影响性能,不影响意义。这样的代码之所以被编写,是因为编写这样的代码是很自然的,而且替代方案很尴尬。如果 && 没有短路,那么该语言可能会消亡并被一些不难使用的东西所取代。
【解决方案3】:

按位运算通常非常便宜,以至于检查会使运算时间增加一倍或更多,而短路逻辑运算符的收益可能非常大。

【讨论】:

    【解决方案4】:

    如果编译器必须对 & 的两个操作数进行检查,我猜你在任何 NORMAL 条件下都会慢得多。

    【讨论】:

      【解决方案5】:

      出于同样的原因,* 在第一个操作数为 0 时不会短路——这将是一个模糊的特殊情况,为其添加特殊的运行时测试会使所有乘法变慢。

      当操作数不是常量时,短路比不短路更昂贵,所以除非程序员明确要求,否则你不想这样做。所以你真的希望有一个干净简单的规则来确定它何时发生。

      【讨论】:

        猜你喜欢
        • 2012-02-27
        • 1970-01-01
        • 1970-01-01
        • 2018-05-17
        • 2011-07-09
        • 2018-06-07
        • 2014-07-01
        • 2011-06-11
        相关资源
        最近更新 更多