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

Hon*_*nza 48 c c++ performance compilation compiler-optimization

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

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

Ali*_*Ali 27

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

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

  • **可能介绍?**除非编译器坏了,否则**不会**.**可以揭开吗?****当然.**和任何其他优化的破碎代码一样. (5认同)
  • @Honza:可能是因为它倾向于使用大量资源.尝试使用LTO编译Chromium,Firefox或LibreOffice ...(仅供参考:至少其中一个甚至不能在具有GNU ld的32位计算机上编译,即使没有LTO,只是因为工作集不适合*虚拟*地址空间!) (3认同)
  • 我同意这样的回答。我也不知道为什么不默认使用 LTO。谢谢确认。 (2认同)
  • @Deduplicator 你确实意识到答案是在 2014 年写的,对吧?当时,LTO 的实施仍然存在一些问题;另请参阅我链接到的文章。 (2认同)

Jer*_*emy 9

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

我确实说它具体.


eri*_*tin 6

如果你的代码写得很好,那应该只是有利的。您可能会遇到编译器/链接器错误,但这适用于所有类型的优化,这种情况很少见。

最大的缺点是它大大增加了链接时间。