是否有理由不使用链接时优化(LTO)?

GCC,MSVC,LLVM以及可能的其他工具链支持链接时(整个程序)优化,以允许编译单元之间的调用优化。

编译生产软件时是否有理由不启用此选项?

我假设“生产软件”是指您发送给客户/投入生产的软件。 为什么不总是使用编译器优化的答案? ( Mankarse友好地指出)主要适用于您想要调试代码的情况(因此软件仍处于开发阶段 – 而不是生产中)。

我能想到的唯一好的,有效的原因是链接时间优化可能会引入细微的错误,请参阅内核的链接时优化 。 假设您有适当的测试来检查您即将发布的软件的正确性,我认为没有理由不默认使用LTO。 (随着时间的推移,LTO越来越成熟,所以我们希望这些微妙的错误会越来越少。)

最近的这个问题提出了另一种可能的(但更具体的)LTO可能产生不良影响的情况:如果有问题的代码用于计时,并且已经使用了单独的编译单元来试图保留检测和检测语句的相对顺序那么LTO很有可能破坏必要的排序。

我确实说它具体。