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

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

if (func()) ; 

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

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

 if (func()) assert(0); 

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

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

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

这被称为as -if规则 。

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

不,可能有副作用的function无法优化,因为那样你可能会“优化”副作用。 而且由于“副作用”我们的意思是“你的程序所做的事情”,允许做这样的事情的编译器不会特别有用。 这就是为什么标准的“假设”规则阻止了你所谈论的那种优化。