1

我正在编写一个使用 boost::accumulators 和 Eigen 线性代数库的模板算法。编译时,Visual Studio 编译器 (cl.exe),内存消耗峰值超过 2.5GB 的 RAM,我的 PC(Windows 7 32 位,3GB 虚拟地址空间)变得无响应(很长一段时间:~1 分钟) . 这些编译单元的二进制文件 (.obj) 为 10-20MB。

我的问题(不针对这些特定库)

  1. 这是大量使用模板的代码的正常行为吗?
  2. 有什么办法可以减少内存需求和编译时间?
  3. 如果问题没有好的解决方案,为什么设计编程语言的人不解决这个问题?了解 C++ 的人越多,他们就越可能使用模板,并生成难以编译的代码和臃肿的二进制文件。
4

2 回答 2

5

如果问题没有好的解决方案,为什么设计编程语言的人不解决这个问题?

因为没有好的解决方案,句号

您所说的问题与 C++ 无关。这是来自 C 的人工制品 - 旧的“翻译单元”。解决这个问题需要重新编译模型。C++ 委员会多年来一直试图在破坏现有 C++ 的每一行的情况下实现这一点(这是一个更大的考虑因素),但这不是一个微不足道的问题。修复它需要巨大的改变。

此外,Clang 具有更好的性能,并且配备可变参数模板的 GCC 的新版本也可以做到。

于 2012-07-01T14:14:18.457 回答
3
  1. 是的。编译模板是消耗内存的。有些实现比其他实现更糟糕。以我个人的经验,在 GCC、MSVC 和 Clang 中,后者最擅长管理其内存使用。

  2. 您可以将庞大的源文件拆分为几个较小的源文件。这将通过几个编译步骤来平衡负载。

  3. 设计编程语言的人只关心实现很少,给编译器编写者足够的自由来超越和竞争。或吸。

于 2012-07-01T14:14:47.467 回答