为什么要用-O2而不是-O3编译

Ben*_*ier 16 optimization g++

我们通常编译-O2因为-O3会"触发微妙的错误".

对于我们的GCC版本,-O3可以实现更积极的内联,这实际上可以揭示其他未被注意到的错误(例如,使用来自将其作为引用参数或对数组进行越界访问的函数的未初始化值).在我看来,这种积极的内联还允许使用更小的函数进行更具表现力的编码方式,并-funswitch-loops有助于在循环中保持变量定义更加局部化.

鉴于我们的代码中的错误比编译器错误更有可能,并且我们使用时-Wall -Wextra没有任何问题我们应该寻找什么样的错误?

如果重要我们使用gcc-4.3.2.编译时间对我们来说不是一个主要问题.

flo*_*olo 10

尺寸.当然,如果尺寸真的很重要(有时就像嵌入式一样),人们会使用-Os.但O3的主要区别在于(从你已经提到的)内联.这可以增加生成的代码大小(但速度更快).也许你想要速度,但不是所有(空间)成本?否则我会发现没有理由不使用O3(除了你知道只在你的O3代码中出现的gcc编译器错误,但只要你没有错误,你就不能在O2重现,我不在乎) .

  • 实际上,依赖于高速缓存大小,内联可能会使代码*从缓存中丢失,从而导致内联失败. (2认同)

tim*_*day 5

不要自欺欺人地认为编译器错误不会潜伏在那里让您的生活陷入困境。这是去年在 Debian 中出现的一个令人讨厌的问题,修复方法是回退到 -O2。

  • 谢谢,这非常有用。我想知道我们是否应该继续使用 `-O3`,直到我们遇到任何像 flolo 建议的问题。如果一个错误会产生如此明显错误的结果,那就更是如此了。 (2认同)