【发布时间】:2017-10-18 15:23:26
【问题描述】:
我的代码中使用了一个在调试模式下使用的宏:
#define contract(condition) \
if (!(condition)) \
throw exception("a contract has been violated");
...但处于发布模式:
#define contract(condition) \
if (!(condition)) \
__builtin_unreachable();
这对 assert() 的影响在于,在发布版本中,由于 UB 传播,编译器可以大量优化代码。
例如,使用以下代码进行测试:
int foo(int i) {
contract(i == 1);
return i;
}
// ...
foo(0);
... 在调试模式下抛出异常,但在发布模式下为无条件的return 1; 生成程序集:
foo(int):
mov eax, 1
ret
条件以及依赖它的所有内容都已优化。
我的问题出现在更复杂的条件下。当编译器无法证明条件没有副作用时,它不会对其进行优化,与不使用合约相比,这是一个runtme惩罚。
有没有办法表示合约中的条件没有副作用,从而总是优化出来?
【问题讨论】:
-
评论不用于扩展讨论;这个对话是moved to chat。
标签: c++ gcc optimization assert compiler-optimization