Visual Studio中Debug和Release

概念

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版中申请 ele6*sizeof(DWORD)=24bytes,实际上分配给你的是32bytesdebug版以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 并没有本质的界限,他们只是一组编译选项的集合,编译器只是按照预定的选项行动。

发布了137 篇原创文章 · 获赞 22 · 访问量 12万+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章