除了调试之外,在gcc中使用-O3还有什么可能的缺点吗?

除了调试之外,在gcc中使用-O3还有什么可能的缺点吗?,gcc,optimization,Gcc,Optimization,在使用gcc编译发布版本时,我是否应该始终指定-O3标志,或者是否存在任何其他可能的缺点 在使用gcc编译发布版本时,我是否应该始终指定-O3标志 不,或者至少可能不是。绩效考核;有时-O3生成的代码比从-O2生成的代码慢 引擎盖下;这实际上是一系列可以单独启用/禁用的不同优化;其中,-O3(和-O2和-Os)只是一个方便的简写,用于实现一组许多优化-O2应该表示“启用所有总是有用的优化”,而-O3应该表示“启用所有经常有用(但可能会使事情变得更糟)的优化”。对于每个-O设置,哪些实际优化启用/

在使用gcc编译发布版本时,我是否应该始终指定
-O3
标志,或者是否存在任何其他可能的缺点

在使用gcc编译发布版本时,我是否应该始终指定-O3标志

不,或者至少可能不是。绩效考核;有时
-O3
生成的代码比从
-O2
生成的代码慢


引擎盖下;这实际上是一系列可以单独启用/禁用的不同优化;其中,
-O3
(和
-O2
-Os
)只是一个方便的简写,用于实现一组许多优化
-O2
应该表示“启用所有总是有用的优化”,而
-O3
应该表示“启用所有经常有用(但可能会使事情变得更糟)的优化”。对于每个
-O
设置,哪些实际优化启用/未启用在手册(中)中有详细说明

如果您不使用快捷方式并自行指定个别优化;然后(使用费劲的“试错”方法并对每种情况的结果进行基准测试),您可以找到一组始终有助于您的程序的优化(并避免启用使程序性能更差的优化)

一种更实用的方法是从
O2
开始,然后确定
-O2
尚未启用的优化中哪些也有帮助

但是,;性能不是唯一重要的。节省时间;大多数人只是尝试一下
-O2
-O3
,然后选择看起来最快的。部分原因是您的软件和编译器不断变化;因此,您所做的任何“费力的基准测试”都需要定期进行


注意:为了实际获得尽可能高的性能,每个翻译单元可以使用不同的优化设置进行编译(因此您可以对每个源文件进行“艰苦的尝试和错误”);然后,生成的一组“以不同方式优化”的对象文件可以输入链接时间优化器以进行更多优化。

这与“一组可以单独启用/禁用的不同优化”非常相似:不完全是,编译器的某些部分直接检查
优化>=3