Skip to content

Latest commit

 

History

History
28 lines (14 loc) · 2.85 KB

Debug和Release模式区别.md

File metadata and controls

28 lines (14 loc) · 2.85 KB

深度好文

  1. 二者的区别主要是编译器 优化级别 的不同,主要有以下优化级别
  • O0 Debug模式,也是默认选项,即不开启优化,方便功能调试

  • O1 致力于在不需要过多的编译时间情况下,尽量减少代码大小和尽量提高程序运行速度,开启了四十多个优化标志

  • Og 如果是为了调试,该选项是比O0更好的选择,它会打开O1大部分优化标志,但是不会启用那些影响调试的标志

  • O2 常见的Release级别,该选项下几乎执行了所有支持的优化选项,它增加了编译时间,提高了程序的运行速度,在O1的基础上又额外打开了以下优化标志.

  • Os 打开了几乎所有的O2优化标志,除了那些经常会增加代码大小的优化标志 还启用了-finline-functions优化标志,使编译器根据代码大小而不是程序运行速度进行优化,为了减少代码大小

  • O3 在O2的基础上又打开了以下优化标志, 开启了自动向量化, 加速非常明显

  • Ofast 更加激进的编译选项,它不会严格遵循标准,在O3的优化基础上,它又开启了一些可能导致不符合IEEE浮点数等标准的性能优化选项,如- fast-math, -fallow-store-data-races等

编译器有这么多优化级别,Debug版本和Release版本其实就是优化级别的区别,Debug称为调试版本,编译的结果通常包含有调试信息,没有做任何优化,方便开发人员进行调试,Release称为发布版本,不会携带调试信息,同时编译器对代码进行了很多优化,使代码更小,速度更快,发布给用户使用,给用户使用以更好的体验。但Release模式编译比Debug模式花的时间也会更多

  1. 二者在代码级别的不同
  • 对于未初始化的变量,Debug模式下会默认对其进行初始化,而Release模式则不会,所以就有个常见的问题,局部变量未初始化时,Debug模式和Release模式表现有所不同

  • Debug模式以32字节为单位分配内存,例如当申请24字节内存时,Release模式下是正常的分配24字节,Debug模式会分配32字节,多了8字节,所以有些数组越界问题在Debug模式下可以安全运行,Release模式下就会出问题

  • Debug模式下可以使用assert,运行过程中有异常现象会及时crash,Release模式下模式下不会编译assert,遇到不期望的情况不会及时crash,稀里糊涂继续运行,到后期可能会产生奇奇怪怪的错误,不易调试,殊不知其实在很早之前就出现了问题。编译器在Debug模式下定义_DEBUG宏,Release模式下定义NDEBUG宏,预处理器就是根据对应宏来判断是否开启assert的