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

far*_*mir 2 c c++

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

if (func())
    ;
Run Code Online (Sandbox Code Playgroud)

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

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

if (func())
    assert(0);
Run Code Online (Sandbox Code Playgroud)

如果我想要确保func()的总是打来电话,如果asssertion失败在调试模式下func()返回错误值.但最近我被警告说我的代码不能保证始终调用函数.

Bau*_*gen 10

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

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

这被称为as -if规则.