【问题标题】:In c++ why does it take so much longer to compile lots of smaller files than larger files?在 C++ 中,为什么编译大量小文件比编译大文件需要更长的时间?
【发布时间】:2012-10-11 19:47:56
【问题描述】:

我最近将我的 c++ 项目中的一些非常大的文件拆分为许多较小的文件(基本上每个类一个文件)。这使编译时间增加了一倍多,并将生成的可执行文件从 1.6mb 扩大到 2.4mb。为什么会产生如此巨大的差异?

这是必须在很多文件中包含一些标题而不是仅仅几个的直接结果吗?

编译器选项:

g++ -Wall -Wextra -g -ggdb -std=c++0x

我指的可执行文件大小是在运行 strip -s executable 之后。

尺寸:

带调试符号前:16MB

带调试符号后:26MB

没有调试符号之前:1.5MB

没有调试符号后:2.4MB

其他问题:

我已经在使用预编译的头文件,方法是将头文件放在 pch.hpp 中,然后在我的 g++ 标志中使用 -include pch.hpp 选项。这是使用 gcc 执行此操作的最佳方法吗?它似乎对编译时间的影响非常小。目前唯一没有被预编译的头文件是项目的一部分,并且随着项目的大量开发而可能发生变化。

【问题讨论】:

  • 您是否确保在 .cpp 中添加尽可能多的包含?
  • 启用 -flto 并重试。您现在正在创建许多对象。这增加了可维护性,但使编译器更难以优化。 -flto 是跨对象优化的优化选项
  • 您是否使用构建系统(例如 CMake)来执行增量构建?

标签: c++ gcc


【解决方案1】:

发生这种情况的原因有多种,这里是一个脑残:

  • 磁盘访问速度变慢(可能不是造成如此大的增长的原因)
  • 包含相同标题的多个翻译单元意味着这些标题被粘贴到每个翻译单元中。标头也每次都进行预处理。 (最可能的原因
  • 标题中定义的静态变量或函数在每个翻译单元中重复
  • 为每个翻译单元专门生成模板符号

以下几点可以帮助您 - 保留多个文件但减少编译时间:

  • 预编译头文件
  • 批量构建 - 从构建中排除 cpp 文件,但将它们包含在编译的不同实现文件中。

【讨论】:

  • 批量构建是指仅为构建过程有效组合 .cpp 文件,纯粹是为了加快构建速度?
  • @Troy 是的。将它们包含在单个 cpp 文件中以加快构建速度,同时将它们分开。
  • 谢谢我刚刚测试了将有问题的 .cpp 文件转换为 bulk.cpp 并进行编译,它比单独的文件快得多。非常感谢。
【解决方案2】:

这通常是因为您在每个编译单元期间都编译了大量系统头文件。将所有目标文件链接在一起也会产生少量开销。

【讨论】:

    【解决方案3】:

    使用构建系统(例如 CMake 或 GNU Make)来执行增量构建,而不是在进行更改时重新编译整个 shebang。

    Pimpl 习惯用法有助于减少由于类的私有成员而需要包含在头文件中的“次要”头文件的数量。我不认为这个习惯用法会减少完全重建的时间,但是当您更改类的私有成员时,它应该有助于减少增量构建的时间。

    我喜欢将 Pimpl 用于作为库或包的可见接口一部分的类。对于“内部”类或充当值类型的类,我不会为 Pimpl 烦恼。

    【讨论】:

      猜你喜欢
      • 2011-06-17
      • 2011-05-19
      • 2010-09-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-06-30
      • 1970-01-01
      相关资源
      最近更新 更多