如果有这样的C或C ++代码:
if (func())
;
如果无法确定函数是否有任何副作用,编译器可以优化对函数func()
的调用吗?
我的问题的起源:我有时会以这样的方式调用assert宏:
if (func())
assert(0);
如果我想确保func()
总是被调用,并且如果func()
返回错误的值,则在调试模式下该断言失败。但最近我被警告说我的代码并不能保证始终调用函数。
答案 0 :(得分:10)
如果编译器无法证明优化掉func
的调用不会改变程序的可观察行为,则不允许进行优化。
因此,除非编译器能够证明不调用该函数没有可观察到的效果,否则将进行调用。请注意,编译器有时可能很聪明,因此如果您想确定,请确保实际的功能具有副作用。 (另一方面,如果没有,你无需关心。)
这称为as-if rule。
答案 1 :(得分:3)
(这是一个C ++答案。请发布一个问题一个编程语言仅,而不是两个。)
不,可能有副作用的功能无法优化,因为那时你可能会"优化"副作用。而且由于副作用和#34;我们的意思是"你的程序所做的事情",允许做这样的事情的编译器不会特别有用。这就是标准" as-if"规则阻止了您正在谈论的那种优化。