我已經用遍了我的代碼一個宏,在調試模式下的功能:如何根據斷言來指導GCC優化而無需運行時成本?
#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懲罰相比,不使用合約。
有沒有辦法表示合同中的條件沒有副作用,所以這是總是優化出來?
註釋不是延長討論;這個談話已經[轉移到聊天](http://chat.stackoverflow.com/rooms/144609/discussion-on-question-by-lyingonthesky-how-to-guide-gcc-optimizations-based-on)。 – deceze