为什么C ++编译器有许多优化级别

时间:2018-01-26 00:58:12

标签: c++ compiler-optimization

我只是在想为什么C ++编译器有许多优化级别,比如O1,O2等。为什么一切都只是一个优化级别O的一部分。

我尝试了很多在线搜索,但没有得到令人信服的答案。

3 个答案:

答案 0 :(得分:4)

脱离我的头脑:优化需要时间(更多优化意味着编译速度变慢),调试优化代码可能更难,更积极的优化可以揭示错误,您可以针对不同的事情(程序大小,速度等)进行优化)...

答案 1 :(得分:1)

虽然编译器足够智能以优化几个常用命令(O1),但他们可以尝试使用不那么频繁的策略(O2),甚至可以尝试使用极端情况(O3)。

生成的代码是否更优化取决于原始代码,有时取决于CPU硬件。告诉哪个" O"最好是尝试并测量运行时间。

请记住,真正了解代码的人就是你。用大脑的一部分来思考它的运行速度。

答案 2 :(得分:0)

正是有两个原因:

  • 没有一个编译器优化序列可以同时优化所有可能感兴趣的程序特征,例如执行时间,编译时间,代码大小,能耗,二进制可移植性等。在编译器优化研究中,这是已知的作为阶段排序问题。
  • 大多数开发人员不想弄清楚要使用哪种编译器优化以及使用什么顺序;他们只想在少数常见场景中使用通常推荐的内容。

这就是为什么编译器开发人员决定提供一小部分优化级别,开发人员可以从中轻松选择,而offering hundreds of fine-grained optimization options则用于高级方案。

术语"优化级别"真的是用词不当,因为它们并不完全是"等级"相对于彼此。一个更好的术语就是"优化组"。

Designing optimization levels对于针对广泛的程序和体系结构的编译器来说是一个复杂的问题,例如GCC,Clang,icc和VC ++。在过去十年中发表的许多研究论文表明,编译器提供的优化级别远不是特定程序,目标体系结构或其特定集合的最佳选择。这激发了对compiler auto-tuning的一系列研究,这可以被视为一种介于几者之间的方法,提供很少的优化级别并提供对编译器优化的细粒度控制。

总之,优化级别为开发人员提供了一个重要的便利,这将是未来几十年所需要的。