概述
概念
Debug通常称为调试版本,它包含调试信息,并且不作任何优化,便于程序员调试程序。
Release称为发布版本,它往往是进行了各种优化,使得程序在代码大小和运行速度上都是最优的,以便用户很好地使用。
Debug模式下的命令行
其各个命令的含义在VS中C++设置中可以看到。
/GS
/W3
/Zc:wchar_t
/I"F:MusicProjAddLutSingleImageMusicEffect..header"
/I"F:MusicProjAddLutSingleImageMusicEffect..headergrender"
/I"F:MusicProjAddLutSingleImageMusicEffect..srcapp"
/I"F:MusicProjAddLutSingleImageMusicEffect..srcgmath"
/I"F:MusicProjAddLutSingleImageMusicEffect..src"
/ZI
/Gm
/Od
/sdl
/Fd"F:MusicProjAddLutSingleImageMusicEffect..tempMusicEffectx64Debugvc140.pdb"
/Zc:inline
/fp:precise
/D "_MBCS"
/errorReport:prompt
/WX-
/Zc:forScope
/RTC1
/Gd
/MDd
/Fa"F:MusicProjAddLutSingleImageMusicEffect..tempMusicEffectx64Debug"
/EHsc
/nologo
/Fo"F:MusicProjAddLutSingleImageMusicEffect..tempMusicEffectx64Debug"
/Fp"F:MusicProjAddLutSingleImageMusicEffect..tempMusicEffectx64DebugMusicEffect.pch"
Release模式下的命令行
/GS
/GL
/W3
/Gy
/Zc:wchar_t
/Zi
/Gm-
/O2
/sdl
/Fd"F:MusicProjAddLutSingleImageMusicEffect..tempMusicEffectx64Releasevc140.pdb"
/Zc:inline
/fp:precise
/D "_MBCS"
/errorReport:prompt
/WX-
/Zc:forScope
/Gd
/Oi
/MD
/Fa"F:MusicProjAddLutSingleImageMusicEffect..tempMusicEffectx64Release"
/EHsc
/nologo
/Fo"F:MusicProjAddLutSingleImageMusicEffect..tempMusicEffectx64Release"
/Fp"F:MusicProjAddLutSingleImageMusicEffect..tempMusicEffectx64ReleaseMusicEffect.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 并没有本质的界限,他们只是一组编译选项的集合,编译器只是按照预定的选项行动。
最后
以上就是执着小懒猪为你收集整理的Visual Studio中Debug和Release概念Debug模式下的命令行Release模式下的命令行两个命令的不同处例子:初始化变量例子: 内存分配方式例子:ASSERT调试宏总结的全部内容,希望文章能够帮你解决Visual Studio中Debug和Release概念Debug模式下的命令行Release模式下的命令行两个命令的不同处例子:初始化变量例子: 内存分配方式例子:ASSERT调试宏总结所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复