编译器能否优化调用函数以及可能的副作用?
问题描述:
如果有C或C++代码:编译器能否优化调用函数以及可能的副作用?
if (func())
;
可以编译器优化了通话的功能func()
如果不能确定功能是否有副作用?
我的问题的起源:我有时称之为在这样的方式断言宏:
if (func())
assert(0);
如果我想确保func()
是总是调用和asssertion在调试模式会失败func()
回报错误的价值。但最近我被警告说我的代码不能保证函数总是被调用。
答
(这是一个C++回答,请张贴问题为一个编程语言只有,而不是两个。)
没有,那可能有副作用的功能不能被优化掉了,因为那么你可能会“优化”副作用。由于“副作用”我们的意思是“你的程序所做的事情”,允许编译器做这样的事情并不会特别有用。这就是为什么标准的“假设”规则阻止了你所谈论的那种优化。
答
如果编译器无法证明优化掉func
的调用不会改变程序的可观察行为,则不允许进行优化。
所以除非编译器能够证明不调用函数没有明显的效果,否则调用将会发生。请注意,编译器有时可能很聪明,所以如果你想确定,确保函数实际上的确有有副作用。 (另一方面,如果没有,你不需要关心。)
这就是所谓的as-if rule。
可以发布'func'的定义吗? –
为什么不'assert(!func())'或' retval = func();断言(RETVAL!);'? –
cxw
这是一种可能产生副作用的常见功能。我不想讨论这个具体功能。我们假设这个函数没有在同一个文件中实现,所以编译器没有内部的信息。 – faramir