2014-02-24 36 views
2
// Example assert function 
inline void assertImpl(bool mExpr, const std::string& mMsg) { 
    if(!mExpr) { printMsg(mMsg); abortExecution(); } 
} 

// Wrapper macro 
#ifdef NDEBUG 
    #define MY_ASSERT(...) do{ ; }while(false) 
#else 
    #define MY_ASSERT(...) assertImpl(__VA_ARGS__) 
#endif 

考慮一下mExprmMsg不是純表達式的情況 - 是否有辦法強制編譯器優化它們?空函數是否使用不純表達式進行優化?

bool globalState{false}; 
bool pureExpression() { return false; } 
bool impureExpression() { globalState = !globalState; return false; } 

// ... 

// This will very likely be optimized out with (NDEBUG == 0) 
MY_ASSERT(pureExpression()); 

// Will this be optimized out with (NDEBUG == 0) 
MY_ASSERT(impureExpression()); 
  • 什麼編譯器通常在不純的表述是「丟棄」的情況呢?
  • 有沒有一種方法可以使100%的純表達式得到優化?
  • 有沒有一種方法可以100%確定不純的表達式得到優化或永不優化?
+0

當定義了'NDEBUG'時,'MY_ASSERT'不是一個表達式。如果你在表達式上下文中使用了'assert',就會導致問題,例如, C++ 11'constexpr'函數:'constexpr foo some_container :: operator [](int i)const {return(MY_ASSERT(i Casey

回答

4

宏展開後,您對impureExpression()的呼叫不再存在:它不是宏展開結果的一部分。如果不存在對您的函數的調用,則只要定義了NDEBUG,就不會在任何優化級別調用該函數。

注意:你說的是NDEBUG == 0,但如果這是你想要的條件,你的#ifdef NDEBUG條件是不正確的。 #ifdef測試宏是否被定義,並且不關注定義是什麼。

0

優化器沒有涉及到這裏。在使用NDEBUG啓用的宏中,無論參數是否被丟棄。

相關問題