减少cpp翻译单元的数量是一个好主意吗?

Ale*_*ter 13 c++ performance build-process module header-files

我发现如果有很多类,当我每个类使用一个*.h和一个*.cpp文件时,编译时间会大大增加.我已经使用预编译头和增量链接,但编译时间仍然很长(是的,我使用boost;)

所以我想出了以下技巧:

  • 将*.cpp文件定义为不可编译
  • 将*.cxx文件定义为可编译
  • 每个应用程序模块添加一个*.cxx文件,#include此模块的所有*.cpp文件.

因此,我只有8个翻译单元,而不是100多个翻译单元.编译时间缩短了4-5倍.

缺点是您必须手动包含所有*.cpp文件(但它不是真正的维护噩梦,因为如果您忘记包含链接器将提醒您的内容),并且某些VS IDE便利不适用于此方案,例如转到/转移到实施等

所以问题是,有很多cpp翻译单元真的是唯一真正的方法吗?我的伎俩是一种已知的模式,还是我错过了什么?谢谢!

sha*_*oth 5

这种方法的一个显着缺点是由于每个翻译单元有一个.obj文件.

如果您创建一个静态库以便在其他项目中重用,那么如果您有几个巨大的翻译单元而不是许多小翻译单元,那么您将经常在这些项目中面对更大的二进制文件,因为链接器将只包含.obj文件,其中包含真正引用的函数/变量在使用该库的项目中.

在大型翻译单元的情况下,更有可能引用每个单元并包含相应的.obj文件.在某些情况下,更大的二进制文件可能是一个问题.一些链接器也足够聪明,只能包含必要的函数/变量,而不是整个.obj文件.

此外,如果包含.obj文件并且包含所有全局变量,则在程序启动/停止时将调用它们的构造函数/析构函数,这肯定需要时间.


Sum*_*uma 1

这个概念称为统一构建