编译器能否优化调用函数以及可能的副作用?

问题描述:

如果有C或C++代码:编译器能否优化调用函数以及可能的副作用?

if (func()) 
    ; 

可以编译器优化了通话的功能func()如果不能确定功能是否有副作用?

我的问题的起源:我有时称之为在这样的方式断言宏:

if (func()) 
    assert(0); 

如果我想确保func()总是调用和asssertion在调试模式会失败func()回报错误的价值。但最近我被警告说我的代码不能保证函数总是被调用。

+2

可以发布'func'的定义吗? –

+1

为什么不'assert(!func())'或' retval = func();断言(RETVAL!);'? – cxw

+0

这是一种可能产生副作用的常见功能。我不想讨论这个具体功能。我们假设这个函数没有在同一个文件中实现,所以编译器没有内部的信息。 – faramir

(这是一个C++回答,请张贴问题为一个编程语言只有,而不是两个。

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

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

所以除非编译器能够证明不调用函数没有明显的效果,否则调用将会发生。请注意,编译器有时可能很聪明,所以如果你想确定,确保函数实际上的确有有副作用。 (另一方面,如果没有,你不需要关心。)

这就是所谓的as-if rule