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)
逻辑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().如果您无条件地需要函数调用,那么您应该首先进行检查.在这种情况下,应该利用对结果的成功分支预测.