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

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

推荐答案

我假设"production software"指的是交付给客户/投入生产的软件.Why not always use compiler optimization?的答案(Mankarse善意地指出)主要适用于需要调试代码的情况(因此软件仍处于开发阶段,而不是生产阶段).

我写这个答案已经6年了,需要更新.早在2014年,问题是:

  • 链路时间优化偶尔引入subtle bugs,例如参见Link-time optimization for the kernel.我认为到2020年,这已经不是什么大问题了.防范这类编译器和链接器错误:进行适当的测试以判断您即将发布的软件的正确性.
  • 100.有人声称,自2014年以来,情况已经有了显著改善,例如,这要归功于slim objects.
  • Large memory usage.This post声称,由于分区,近年来情况有了显著改善.

从2020年开始,我将try 在我的任何项目中默认使用LTO.

C++相关问答推荐

C中的整字母后缀i是什么

从STdin读写超过4096个字节

想了解 struct 指针和空指针转换

以c格式打印时间戳

MISRA C:2012 11.3违规强制转换(FLOAT*)到(uint32_t*)

我编译了一个新的c程序,并收到以下错误

空指针的运行时强制转换

为什么删除CAP_DAC_OVERRIDE后创建文件失败?

预先分配虚拟地址空间的区域

如何在C中只对字符串(包含数字、单词等)中的数字进行重复操作?

预处理器宏扩展(ISO/IEC 9899:1999(E)§;6.10.3.5示例3)

Caesar密码调试:输出文本末尾的问号和随机字符

为什么GCC-O1优化破解了这个代码,为了一个GameBoy高级只读存储器而修改了VRAM的循环?

如何摆脱-WIMPLICIT-Function-声明

OMP并行嵌套循环

Dlsym()的手册页解决方法仍然容易出错?

在我的函数中实现va_arg的问题

为什么<到达*时不会转换为>?

为什么需要struct in_addr

nullptr_t 是否会 destruct 类型双关或指针转换?