我们通常使用-O2
进行编译,因为-O3
会“触发细微的错误”。
对于我们的GCC版本,-O3
启用了更具侵略性的内联,它实际上可以揭示原本不会引起注意的错误(例如,使用函数中未初始化的值并将其用作参考参数或对数组进行越界访问)。在我看来,这种积极的内联还允许使用更小的函数进行更富有表现力的编码方式,并且-funswitch-loops
有助于使变量定义在循环中更局部。
假设我们代码中的错误比编译器错误的可能性高几个数量级,并且我们没有任何问题地使用-Wall -Wextra
,我们应该寻找哪种错误?
如果重要,我们使用gcc-4.3.2
。编译时间对我们来说不是主要问题。
最佳答案
尺寸。当然,如果大小确实很重要(有时很重要,例如嵌入式),则可以使用-Os
。但是O3的主要区别是(您已经提到过)内联。这会增加生成的代码大小(但速度更快)。也许您想要速度,但根本不希望(空间)成本吗?否则,我将没有理由不使用O3(除非您知道gcc编译器错误仅在O3的代码中发生,但是只要您没有错误,就无法在O2上重现,我不在乎) 。
关于optimization - 为什么有人要用-O2而不是-O3进行编译,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/5637828/