Visual Studio中Debug和Release
阿新 • • 發佈:2019-01-31
概念
Debug通常稱為除錯版本,它包含除錯資訊,並且不作任何優化,便於程式設計師除錯程式。
Release稱為釋出版本,它往往是進行了各種優化,使得程式在程式碼大小和執行速度上都是最優的,以便使用者很好地使用。
Debug模式下的命令列
其各個命令的含義在VS中C++設定中可以看到。
/GS
/W3
/Zc:wchar_t
/I"F:\MusicProjAddLutSingleImage\MusicEffect\..\header"
/I"F:\MusicProjAddLutSingleImage\MusicEffect\..\header\grender"
/I"F:\MusicProjAddLutSingleImage \MusicEffect\..\src\app"
/I"F:\MusicProjAddLutSingleImage\MusicEffect\..\src\gmath"
/I"F:\MusicProjAddLutSingleImage\MusicEffect\..\src"
/ZI
/Gm
/Od
/sdl
/Fd"F:\MusicProjAddLutSingleImage\MusicEffect\..\temp\MusicEffect\x64\Debug\vc140.pdb"
/Zc:inline
/fp:precise
/D "_MBCS"
/errorReport:prompt
/WX-
/Zc:forScope
/RTC1
/Gd
/MDd
/Fa"F:\MusicProjAddLutSingleImage \MusicEffect\..\temp\MusicEffect\x64\Debug\"
/EHsc
/nologo
/Fo"F:\MusicProjAddLutSingleImage\MusicEffect\..\temp\MusicEffect\x64\Debug\"
/Fp"F:\MusicProjAddLutSingleImage\MusicEffect\..\temp\MusicEffect\x64\Debug\MusicEffect.pch"
Release模式下的命令列
/GS
/GL
/W3
/Gy
/Zc:wchar_t
/Zi
/Gm-
/O2
/sdl
/Fd"F:\MusicProjAddLutSingleImage \MusicEffect\..\temp\MusicEffect\x64\Release\vc140.pdb"
/Zc:inline
/fp:precise
/D "_MBCS"
/errorReport:prompt
/WX-
/Zc:forScope
/Gd
/Oi
/MD
/Fa"F:\MusicProjAddLutSingleImage\MusicEffect\..\temp\MusicEffect\x64\Release\"
/EHsc
/nologo
/Fo"F:\MusicProjAddLutSingleImage\MusicEffect\..\temp\MusicEffect\x64\Release\"
/Fp"F:\MusicProjAddLutSingleImage\MusicEffect\..\temp\MusicEffect\x64\Release\MusicEffect.pch"
兩個命令的不同處
- Release GL
- 全程式優化開啟
- Release下/Gy
- 啟用函式級連結開啟
- Debug下ZI Release下Zi
- ZI 除錯資訊格式:用於程式設計並繼續的程式資料庫
- Zi 除錯資訊格式:程式資料庫
- Debug下GM Release下Gm-
- GM 啟用最小重新生成
- Gm- 不啟用最小重新生成
- Debug下OD Release下O2
- OD 禁用優化
- O2 使速度最大化
- Debug下 RTC1
- RTC1 基本執行時檢查:堆疊幀 未初始化的變數
- Release下Oi
- Oi 啟用內部函式
- Debug下MDd Release下MD
- MDd 執行庫:多執行緒除錯
- MD 執行庫:多執行緒DLL
例子:初始化變數
debug跟release在初始化變數時所做的操作是不同的。
- debug是將每個位元組位都賦成0xcc
- release的賦值近似於隨機
例子: 記憶體分配方式
DEBUG版和RELEASE版的記憶體分配方式是不同的。
- 如果你在DEBUG版中申請
ele
為6*sizeof(DWORD)=24bytes
,實際上分配給你的是32bytes
(debug版以32bytes為單位)。 - 而在release版,分配給你的就是
24bytes
(r**elease版以8bytes為單位**)。
所以在debug版中如果你寫ele[6],可能不會有 什麼問題,而在release版中,就有ACCESS VIOLATE。
例子:ASSERT除錯巨集
一些程式碼在Release模式下不會報錯,但在Debug模式下會報錯,這是因為Debug模式相當於在編譯程式的時候定義了一個巨集:#define _DEBUG。在Release模式下定義了一個巨集:#define NDEBUG。
比如我們來看assert函式的實現
#undef assert
#ifdef NDEBUG
#define assert(expression) ((void)0)
#else
_ACRTIMP void __cdecl _wassert(
_In_z_ wchar_t const* _Message,
_In_z_ wchar_t const* _File,
_In_ unsigned _Line
);
#define assert(expression) (void)( \
(!!(expression)) || \
(_wassert(_CRT_WIDE(#expression), _CRT_WIDE(__FILE__), (unsigned)(__LINE__)), 0) \
)
#endif
當定義了巨集NDEBUG之後,assert函式是不起作用的。
總結
實際上,Debug和 Release 並沒有本質的界限,他們只是一組編譯選項的集合,編譯器只是按照預定的選項行動。