C++条件运算符性能

Kol*_*nya 3 c++ performance conditional conditional-statements

我有条件声明expensive_foo(),在99.9%的情况下是假的.我有一个条件陈述bar,在约50%的情况下都是如此.

如果两个陈述都是真的,我想要采取一些行动.所以我几乎肯定知道这expensive_foo()是假的,我想检查它是否bar属实.

下面的代码是否会检查expensive_foo()是否bar属实?或者expensive_foo()每次都会检查?

if ( bar && expensive_foo() )
{
    ...
}
Run Code Online (Sandbox Code Playgroud)

或者我需要制作这样的结构:

if ( bar )
{
    if ( expensive_foo() )
    {
        ...
    }
}
Run Code Online (Sandbox Code Playgroud)

Ker*_* SB 5

逻辑AND运算符&&是短路的,这意味着当且仅当第一个操作数被评估为时,才能保证第二个操作数被计算true.条件if (bar && foo)和条件if (bar) if (foo)相同.

鉴于foo计算成本很高,你几乎肯定应该bar先检查.尽管bar分支预测器不能很好地预测,但与计算相比,这是一个微小的影响foo.

因此,结构应该是:

if (bar)
{
    if (bool const foo = compute())   // expensive
    {
        // ...
    }
}
Run Code Online (Sandbox Code Playgroud)

请注意,所有这些结构意味着我们可能会或可能不会打电话compute().如果您无条件地需要函数调用,那么您应该首先进行检查.在这种情况下,应该利用对结果的成功分支预测.