c++ - C/C++ 优化器能否决定延迟评估仅用于短路评估的值?

标签 c++ c compilation compiler-optimization short-circuiting

我喜欢像这样重构复杂的条件:

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++ 优化器推迟评估我的中间值,直到需要它们时?

最佳答案

当然。前提是编译器可以看到足够的信息来确定 foobarobj.longMethodName() 没有任何 对代码的可观察行为的其他影响。

是否有编译器这样做是另一个问题。我比较怀疑 它;它需要一些非常特殊的逻辑,这不在 通常的优化技术列表,对于某些东西 实际上没有人这样做。 (我怀疑大多数程序员会 找原版,格式正确,待更 比有很多额外变量的可读。)

编辑:

我想知道是否值得指出编译器是允许的 调用所有三个函数,即使写了 if:

if ( foo( blah ) || (bar( p1, p2, p3 ) && ! obj.lMN() ) )

(虽然我无法想象会有这样的情况。)标准使得 没有关于何时调用哪些函数的要求; 它只需要可观察到的行为是相同的(相同的 值和相同的顺序---不保证关于 时间)“好像”遵循了程序的形式语义。 唯一可以算作可观察行为的是 IO (以某种形式)和对 volatile 对象的访问。

关于c++ - C/C++ 优化器能否决定延迟评估仅用于短路评估的值?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22175902/

相关文章:

c - 我应该使用哪个 : C9 9's complex.h library or the "GNU Extensions for Complex Number Types"?

将 void 指针转换为 long 类型,而不是 long 指针?

c++ - 编译 OpenCV 程序并且不需要安装 opencv

c++ - 为什么 socket(PF_INET,SOCK_STREAM,0) 返回 -1?

c++ - 如何将数据(Qt::UserRole)设置到 QSqlQueryModel 列中?

c++ - 如何比较C++ slice_array?为什么它不能与 valarray 进行比较?

c++ - 在linux中使用c/c++运行在一台机器上的进程如何知道另一个进程是否正在不同的机器上运行?

c - C中通过文件进行多项式赋值

.net - VS 2015移动文件后无法运行发布

java - JRE 版本必须等于或高于 JDK 版本?