我喜欢像这样重构复杂的条件:
if (foo(blah) || (bar(param1, param2, param3) && !obj.longMethodName())) ...
进入这个:
bool foo_true = foo(blah);
bool bar_true = bar(param1, param2, param3);
bool long_true = obj.longMethodName();
if (foo_true || (bar_true && !long_true)) ...
我认为这使代码更容易理解,并且有助于调试,因为您可以看到用于计算最终条件的中间结果。
但是:在原来的代码中,由于短路,只有当foo
返回true
时,bar
才会被计算,并且 longMethodName
仅当 bar
返回 true
时。
假设函数是“纯”的,方法是const
,编译器可以看到所有的函数体。 是否允许 C++ 优化器推迟评估我的中间值,直到需要它们时?
最佳答案
当然。前提是编译器可以看到足够的信息来确定
foo
、bar
和 obj.longMethodName()
没有任何
对代码的可观察行为的其他影响。
是否有编译器这样做是另一个问题。我比较怀疑 它;它需要一些非常特殊的逻辑,这不在 通常的优化技术列表,对于某些东西 实际上没有人这样做。 (我怀疑大多数程序员会 找原版,格式正确,待更 比有很多额外变量的可读。)
编辑:
我想知道是否值得指出编译器是允许的 调用所有三个函数,即使写了 if:
if ( foo( blah ) || (bar( p1, p2, p3 ) && ! obj.lMN() ) )
(虽然我无法想象会有这样的情况。)标准使得 没有关于何时调用哪些函数的要求; 它只需要可观察到的行为是相同的(相同的 值和相同的顺序---不保证关于 时间)“好像”遵循了程序的形式语义。 唯一可以算作可观察行为的是 IO (以某种形式)和对 volatile 对象的访问。
关于c++ - C/C++ 优化器能否决定延迟评估仅用于短路评估的值?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22175902/