12

本质上,我想知道什么是 c++ 优化 (/O) 和整个程序优化 (/GL)。

将不胜感激深入的解释。

C++ 优化

整个程序优化

谢谢

4

3 回答 3

17

全程序优化是跨模块优化的一个方面。由于这些语言的编译模型,这在 C 和 C++ 的上下文中也称为链接时优化。

基本上,想象一下你的程序的整个源代码被粘贴到一个文件中,源文件、头文件和库文件,一切。在那种假设的情况下,编译器将有很多额外的优化机会:内联、死代码删除、重复数据删除等。

跨模块优化是指任何尝试允许此类优化的技术,即使在 C 和 C++ 编译器惯用的传统的一次一个 TU 编译中也是如此。通常,这涉及将额外信息(甚至可能是整个解析的源内容)添加到各个目标文件中,并允许链接器在看到应用程序的所有成分目标文件后执行某些编译任务。

于 2012-12-18T17:33:26.953 回答
5

MSVC 是所谓的优化编译器。OC 获取您编写的代码并重写其中的部分代码,以最小化内存占用、最大化执行速度或两者兼而有之。他们通过利用代码运行平台的深厚技术知识来做到这一点,通常针对特定的指令集。

MSVC、GCC、LLVM 和许多其他 OC 都使用许多不同的技术来实现这一点。这些技术本身远远超出了互联网帖子中可以解释的范围,即使我都知道(我不知道)。但是有一些事情你应该记住。

一个经过优化的程序比没有经过优化的程序更难调试。很多代码可能已经在程序中的执行顺序和位置方面被移动了,并且符号被剥离了。

一般来说,该标准允许编译器对您的程序进行任何它希望的更改,只要您的程序的可观察行为是相同的“ AS-IF ”,没有进行任何更改。

负责优化代码的编译器部分是由非常聪明的人组成的专门团队多年来设计和编写的。最终的结果是一个编译器,总的来说,它在优化代码方面比你希望的要好得多。通常,出于两个原因,尝试实现自己的微优化是没有意义的。一,编译器通常可以做得更好,二,你编写的微优化会混淆编译器实现自己优化的能力。通过手动对代码进行微优化,实际上可能会使程序性能更差

于 2012-12-18T17:34:27.027 回答
1

整个程序优化在 Visual Studio 中称为 LTCG - 链接时间代码生成 - 这是关于LTCG的文章。

于 2012-12-18T17:38:25.280 回答