【发布时间】:2012-12-05 23:04:22
【问题描述】:
基本上我想知道什么是 c++ 优化 (/O) 和整个程序优化 (/GL)。
希望有深入的解释。
谢谢
【问题讨论】:
-
试试this。
-
感谢所有精彩的输入
标签: c++ visual-studio optimization
基本上我想知道什么是 c++ 优化 (/O) 和整个程序优化 (/GL)。
希望有深入的解释。
谢谢
【问题讨论】:
标签: c++ visual-studio optimization
整个程序优化是跨模块优化的一个方面。由于这些语言的编译模型,这在 C 和 C++ 的上下文中也称为链接时间优化。
基本上,假设您的程序的整个源代码被粘贴到一个文件中,源文件、头文件和库文件,所有内容。在这种假设情况下,编译器将有很多额外的优化机会:内联、死代码删除、重复数据删除等。
跨模块优化是指尝试允许此类优化的任何技术,即使在 C 和 C++ 编译器惯用的传统的一次一个 TU 编译中也是如此。通常,这涉及将额外信息(甚至可能是整个解析的源内容)添加到各个目标文件中,并允许链接器在看到应用程序的所有成分目标文件后执行某些编译任务。
【讨论】:
MSVC 是所谓的Optimizing Compiler。 OC 获取您编写的代码并重写其中的部分代码,以最小化内存占用、最大化执行速度或两者兼而有之。他们通过利用对运行代码的平台的深厚技术知识来做到这一点,通常针对特定的指令集。
诸如 MSVC、GCC、LLVM 和许多其他 OC 都使用许多不同的技术来实现这一点。这些技术本身远远超出了互联网帖子中可以解释的范围,即使我都知道(我不知道)。但是有一些事情你应该记住。
经过优化的程序比没有经过优化的程序更难调试。很多代码可能在程序中的执行顺序和位置都被移动了,并且符号被剥离了。
一般来说,该标准允许编译器对您的程序进行它希望的任何更改,只要您的程序的可观察行为是相同的“AS-IF”没有进行任何更改.
编译器中负责优化代码的部分是由非常聪明的人组成的专门团队多年来设计和编写的。最终的结果是一个编译器,总的来说,它在优化代码方面比你希望的要好得多。通常,出于两个原因,尝试实现自己的微优化是没有意义的。第一,编译器通常可以做得更好,第二,您编写的微优化会使编译器无法实现自己的优化。通过手动对代码进行微优化,您实际上可能会使您的程序执行更差。
【讨论】:
pdb 信息)与优化设置无关。当然,对于优化的代码,有些符号不再起作用了,行号可能会被关闭,但最好没有任何符号。
整个程序优化在 Visual Studio 中称为 LTCG - 链接时间代码生成 - 这是 LTCG 上的 writeup。
【讨论】: