我在 C++ 项目中有自动生成的代码(大约 18,000 行,基本上是一组数据)和其他大约 2,000 行代码。该项目开启了链接时间优化操作。 /O2 和快速代码优化。 VC++ 2008 Express 编译代码需要非常长的时间(大约 1.5 小时)。毕竟只有 18,000 行,为什么编译器要花这么多时间?
对 18,000 代码的一点解释。它是普通的 C,甚至不是包含许多未打包的 for 循环的 C++,示例如下:
a[0].a1 = 0.1284; a[0].a2 = 0.32186; a[0].a3 = 0.48305; a[1].a1 = 0.543; ......................
它基本上填充了一个复杂的结构。但我想编译器并没有那么复杂。
Debug模式速度很快,只有Relase模式有这个问题。在我这18000行代码之前,它们都是没问题的。 (此时数据位于外部位置)。然而,发布模式做了很多工作,将 exe 的大小从 1,800kb 减少到 700kb。
这个问题确实发生在链接阶段,因为所有 .obj 文件都是生成的。我也怀疑链接时代码生成,但无法弄清楚哪里出了问题。
影响链接时间的因素有很多,包括但不限于:
即使在新的四核上编译 18,000 行模板元编程和 1.5 小时的链接也不会完全让我感到惊讶。
从历史上看,C++ 计算缓慢的一个常见原因是过多的头文件包含,通常是模块化不良的结果。 通过在许多小源文件中包含相同的大头文件,您可以获得大量冗余编译。 这些情况下通常的参考是Lakos。
您没有说明是否使用预编译头,这是头文件重构的快速而肮脏的替代品。
这就是为什么我们为调试版本生成大量 DLL,但通常将它们链接到发布版本。 处理更多的整体可执行文件更容易(对于我们的特定目的),但链接需要很长时间。
正如评论之一所述,您可能启用了 Link Time Code Generation (
/LTCG
),这会将大部分代码生成和优化移至链接阶段。
这可以实现一些惊人的优化,但也显着增加链接时间。
C++ 团队表示,他们已经显着优化了 VS 2010 的链接器。