我是靠谱客的博主 执着小懒猪,最近开发中收集的这篇文章主要介绍Visual Studio中Debug和Release概念Debug模式下的命令行Release模式下的命令行两个命令的不同处例子:初始化变量例子: 内存分配方式例子:ASSERT调试宏总结,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

概念

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版中申请 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 并没有本质的界限,他们只是一组编译选项的集合,编译器只是按照预定的选项行动。

最后

以上就是执着小懒猪为你收集整理的Visual Studio中Debug和Release概念Debug模式下的命令行Release模式下的命令行两个命令的不同处例子:初始化变量例子: 内存分配方式例子:ASSERT调试宏总结的全部内容,希望文章能够帮你解决Visual Studio中Debug和Release概念Debug模式下的命令行Release模式下的命令行两个命令的不同处例子:初始化变量例子: 内存分配方式例子:ASSERT调试宏总结所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(51)

评论列表共有 0 条评论

立即
投稿
返回
顶部