GCC中-O1 -O2 -O3 优化的原理是什么?

做OI时候发现C++开了O2优化后可以在不超时的情况下随便用STL,非常好奇这是怎么实现的?
关注者
760
被浏览
41070
俺来打个酱油。后面有谁来展开解答这个话题就功德无量了。
@vczh 大大讲了C++的语言和STL的一侧。这只覆盖了要优化的对象但没覆盖如何优化。
@空明流转 大大讲了编译器优化话题太巨大。话题是巨大,不过总有切入点。

楼主只是想大概知道些名词但不想太深入的话,可以先从GCC的文档入手:gcc.gnu.org/onlinedocs/
这份文档讲解了每层-O参数对应哪些具体的优化。每个具体的优化参数是“-f + 优化名”,例如-fdce的优化名是DCE,也就是dead code elimination。

知道优化的名字就可以去搜搜相关资料了。唯一的问题就是GCC用的这些优化名称可能跟教科书叫法不一样⋯ 例如-fmove-loop-invariant在其它资料里可能更多叫做loop-invariant code motion(LICM)。

更高层一点,还可以从文档中了解一下GCC的工作流程:gcc.gnu.org/onlinedocs/