选项的名称可以说明Visual Studio /编译器的真正含义以及真正的后果是什么?
编辑:如果你搜索谷歌,你可以找到这个地址,但这不是我真正想要的.我想知道真实的事情发生了.例如,为什么循环得到的时间更少等等.
如果没有优化,编译器会生成非常愚蠢的代码 - 每个命令都以非常简单的方式编译,以便它能够完成预期的操作.Debug构建默认情况下禁用了优化,因为没有优化,生成的可执行文件会以简单的方式匹配源代码.
一旦打开优化,编译器就会应用许多不同的技术来使代码运行得更快,同时仍然执行相同的操作.Visual C++中优化和未优化构建之间最明显的区别是变量值在优化构建中尽可能长地保存在寄存器中,而没有优化它们总是存储在内存中.这不仅会影响代码速度,还会影响调试.由于这种优化,调试器无法在您逐步执行代码时可靠地获取变量值.
编译器应用了多个其他优化,如/ O选项(优化代码)MSDN文档中所述.有关各种优化技术的一般描述,请参阅Wikipedia Compiler Optimization文章.
来自Paul Vick的博客:
它会删除我们原本会发出的任何NOP指令以帮助调试.当关闭优化(并打开调试信息)时,编译器将为没有任何实际IL关联但您可能想要设置断点的行发出NOP指令.像这样的最常见的例子是"If"语句的"End If" - 没有为End If发出实际的IL,所以我们不发出NOP,调试器不会让你设置断点在上面.启用优化会强制编译器不发出NOP.
我们对生成的IL进行简单的基本块分析,以删除任何死代码块.也就是说,我们将每个方法分解为由分支指令分隔的IL块.通过快速分析块如何相互关联,我们可以识别任何没有分支的块.因此,我们可以找出永远不会被执行的代码块,并且可以省略,使得程序集稍微小一些.我们此时也做了一些小的分支优化 - 例如,如果你转到另一个GoTo语句,我们只是优化第一个GoTo以跳转到第二个GoTo的目标.
我们发出一个DebuggableAttribute,IsJITOptimizerDisabled设置为False.基本上,这允许运行时JIT优化代码的方式,包括重新排序和内联代码.这将产生更高效和更小的代码,但这意味着尝试调试代码可能非常具有挑战性(因为任何试过它的人都会告诉你).JIT优化的实际列表是我不知道的事情 - 也许像Chris Brumme这样的人会在某个时候讨论这个问题.它的长短是因为优化开关能够进行优化,这可能会使设置断点和更难以踩踏代码.