本文主要讨论Windows平台Visual Studio 2017开发环境下Debug构建和Release构建的区别。其他开发环境可能会有所区别。
Debug构建
使用Debug配置构建的程序主要用于程序的调试。在Debug配置下默认会将所有编译优化关闭,包括:
- 禁用优化,/Od
- 关闭内部函数,
- 关闭全程序优化
预处理器定义:
- _DEBUG 宏定义
调试信息格式:
- /ZI,生成的PDB文件支持“编译并继续”的特性。与大部分编译优化不兼容。
Release构建
使用Release配置构建的程序主要用于程序的发布。在Release配置下默认会开启大部分优化,包括:
- 最大速度优化,/O2
- 启用内部函数(intrinsic),/Oi。使用内部函数生成的代码速度会更快,但是代码可能会更大。如果一个函数是内部函数,在编译时会像内联函数一样插入到代码中。这样可以避免函数调用的开销。
- 开启全程序优化,/GL。通过将代码生成延迟到链接时间来启动跨模块优化,需要和链接器选型“链接时间代码生成一起使用”。
如果使用Release模式去调试程序,就会发现程序的执行顺序与代码的顺序可能不一致(前后跳来跳去)。原因正是来自于编译优化导致程序的执行顺序可能与原始代码不同。
预处理器定义:
- NDEBUG 宏定义
调试信息格式:
- /Zi,会生成一个独立的PDB文件,包含所有用于调试的符号信息。这种分离使得生成的exe或DLL中不会包含调试信息,大小会更小。该选项不会影响编译优化。相反的/Z7会将PDB内嵌到生成的可执行文件或者动态链接库中。
2021年11月27日更新