在c ++中,为什么编译大量文件比编写大文件需要更长的时间?

时间:2012-10-11 19:47:57

标签: c++ gcc

我最近将我的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执行此操作的最佳方式吗?它似乎对编译时间的影响非常小。目前尚未预编译的唯一标题是项目的一部分,并且随着项目的大量开发而有所变化。

3 个答案:

答案 0 :(得分:11)

有几个原因导致这种情况发生,这是一个题外话:

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

这里有一些可以帮助你的东西 - 保留多个文件但减少编译时间:

  • 预编译标题
  • 批量构建 - 从构建中排除cpp个文件,但将它们包含在已编译的其他实现文件中。

答案 1 :(得分:1)

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

答案 2 :(得分:0)

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

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

我喜欢将Pimpl用于属于库或包的可见界面的类。我不打扰Pimpl用于“内部”类或充当值类型的类。