2009-08-04 63 views
0

我有自动生成的代码(约18,000行,基本上是一个数据包)和其他约2000行代码在C++项目中。该项目打开链接时间优化操作。/O2和快速代码优化。为了编译代码,VC++ 2008 express需要非常长的时间(大约1.5小时)。毕竟,它只有18000行,为什么编译器需要这么多时间?为什么VC++ 2008编译器在链接阶段花费太多时间?

对18,000码的一点解释。这是普通的C,甚至没有C++,它包括许多无包装的环,样品将是:

一个[0]指定.A1 = 0.1284; a [0] .a2 = 0.32186; a [0] .a3 = 0.48305; a [1] .a1 = 0.543; ..................

它基本上填充了一个复杂的结构。但我觉得编译器不那么复杂。

调试模式很快,只有Relase模式有这个问题。在我拥有18,000行代码之前,它们都很好。 (那时数据在外部位置)。然而,释放模式做了很多工作,将exe的大小从1,800kb减小到700kb。

此问题确实发生在链接阶段,因为所有的.obj文件都会生成。我怀疑链接时代码的产生,但无法弄清楚哪里错了。

+0

微软连接器历来是废话。我不能代表当代人。但是你真的在问关于链接还是编译?你的问题的文本没有说清楚。 – 2009-08-04 22:01:34

+1

@Neil,开启链接时间代码生成功能后,大多数优化都会延迟到链接时间,这会大大减少构建时间,使链接器成为重量级。此外,您对历史编译器的评论不受支持,实际上并无帮助。 – 2009-08-04 22:04:09

+0

@liuliu:我不确定我能否在没有看到代码的情况下给出确切的答案。我希望别人可以。 – 2009-08-04 22:24:49

回答

3

有几个因素会影响链接时,包括但不限于:

  • 计算机的速度,尤其是可用内存包含在构建
  • 库。
  • 编程范例 - 你有没有使用boost?

18,000行模板元编程编译即使是新的四核和1.5小时的链接也不会让我感到惊讶。

2

从历史上看,慢C++计算的一个常见原因是过多的头文件包含,通常是模块化较差的结果。通过在许多小型源文件中包含相同的大标题,您可以获得大量冗余编译。在这些情况下通常的参考文献是Lakos

你没有说明你是否使用预编译头文件,这是头文件重构的快速和肮脏的替代品。

0

这就是为什么我们为我们的调试版本生成大量DLL,但通常将它们链接到我们的发布版本。 (为了我们的特定目的)更容易处理更多单片可执行文件,但需要很长时间才能链接。

相关问题