编译器可以优化输出调用以发挥可能的副作用吗?

时间:2016-09-23 15:23:43

标签: c++ c

如果有这样的C或C ++代码:

if (func())
    ;

如果无法确定函数是否有任何副作用,编译器可以优化对函数func()的调用吗?

我的问题的起源:我有时会以这样的方式调用assert宏:

if (func())
    assert(0);

如果我想确保func() 总是被调用,并且如果func()返回错误的值,则在调试模式下该断言失败。但最近我被警告说我的代码并不能保证始终调用函数。

2 个答案:

答案 0 :(得分:10)

如果编译器无法证明优化掉func的调用不会改变程序的可观察行为,则不允许进行优化。

因此,除非编译器能够证明不调用该函数没有可观察到的效果,否则将进行调用。请注意,编译器有时可能很聪明,因此如果您想确定,请确保实际的功能具有副作用。 (另一方面,如果没有,你无需关心。)

这称为as-if rule

答案 1 :(得分:3)

(这是一个C ++答案。请发布一个问题一个编程语言,而不是两个。

不,可能有副作用的功能无法优化,因为那时你可能会"优化"副作用。而且由于副作用和#34;我们的意思是"你的程序所做的事情",允许做这样的事情的编译器不会特别有用。这就是标准" as-if"规则阻止了您正在谈论的那种优化。