[英]c++ force compiler to opt out some piece of code
我有一段代碼:
// some code, which only do sanity check
expensive checks
// sanity check end
現在,我如何告訴編譯器強制其選擇退出? 基本上,這意味着當我使用-O2或O3進行編譯時,我不希望它在那里。
謝謝!
您可以使用一個常數和一個if / def對來完成此操作。 這樣,仍可以編譯代碼並檢查錯誤,但在優化過程中將其省略。 這樣可以防止可能會破壞校驗碼的更改無法被檢測到。
#if defined(USE_EXPENSIVE_CHECKS) || defined(DEBUG)
#define USE_EXPENSIVE_CHECKS_VALUE true
#else
#define USE_EXPENSIVE_CHECKS_VALUE false
#endif
namespace {
const bool useExpensiveChecks = USE_EXPENSIVE_CHECKS_VALUE;
};
void function()
{
if(useExpensiveChecks == true)
{
// expensive checks
}
}
不必依賴編譯器優化代碼,而僅在希望代碼運行時才可以向編譯器傳遞附加的符號定義:
// some code, which only do sanity check
#ifdef my_symbol
expensive checks
#endif
// sanity check end
在預處理器中使用宏和條件實際上是避免編譯器生成代碼的唯一方法。
因此,這是我的處理方式:
#ifdef NEED_EXPENSIVE_CHECKS
inline expensive_checking(params...)
{
... do expensive checking here ...
}
#else
inline expensive_checking(params...)
{
}
#endif
然后只需致電:
some code
expensive_checking(some_parameters...)
some other code
空的內聯函數將在任何體面的現代編譯器中導致“無代碼”。 在調試版本設置中使用-DNEED_EXPENSIVE_CHECKS
,不要在發行版本中使用它。
我也知道結合使用宏和函數,例如:
#ifdef NEED_EXPENSIVE_CHECKS
#define EXPENSIVE_CHECKS(stuff...) expensive_checks(__FILE__, __LINE__, stuff...)
inline expensive_checks(const char *file, int line, stuff ...)
{
if (some_checking)
{
cerr << "Error, some_checking failed at " << file << ":" << line << endl;
}
}
#else
#define EXPENSIVE_CHECKS(stuff...)
#endif
現在,您可以獲得有關什么文件和什么行失敗的信息,如果在很多地方進行了檢查,這將非常有用(如果需要,您也可以使用__function__
或__pretty_function__
來獲取函數名稱)。
顯然, assert()
宏實際上會執行我的宏解決方案,除非它通常不提供文件名和行號。
將您的支票移到其他函數中,然后導入cassert並寫入assert(expensive_check())
。 如果要禁用檢查,請在裝入cassert 之前使用#define NDEBUG
。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.