7

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

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

编译器选项:

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

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

尺寸:

使用调试符号之前:16MB

使用调试符号后:26MB

没有调试符号之前:1.5MB

没有调试符号后:2.4MB

附加问题:

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

4

3 回答 3

11

There are several reasons why this could happen, here's a braindump:

  • slower disk access (probably not the cause for such a big increase)
  • multiple translation units including the same headers means those headers are pasted in every one of them. The headers are also pre-processed every time. (most likely cause)
  • static variables or functions defined in headers are duplicated in each translation unit
  • symbols for templates are generated for each translation unit that specialize them

Here's some things that can help you out - keep multiple files but reduce compilation time:

  • precompiled headers
  • bulk builds - exclude cpp files from the build but include them in a different implementation file that is compiled.
于 2012-10-11T19:50:37.177 回答
1

This typically because you are compiling lots of system headers during every compilation unit. There is also a minor overhead associated with linking all the object files together.

于 2012-10-11T19:50:31.740 回答
0

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

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

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

于 2012-10-11T20:34:35.730 回答