繁体   English   中英

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

[英]Is reducing number of cpp translation units a good idea?

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

所以我想出了以下技巧:

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

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

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

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

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

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

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

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

我已经看到你在视频游戏中做了什么,因为它有助于编译器进行优化,否则无法做到以及节省大量内存。 我见过“超级构建”和“批量构建”是指这个想法。 如果它有助于加速你的构建,为什么不..

将大量C ++源代码文件捆绑到一个文件中是最近几次提到过的一种方法,特别是当人们构建大型系统并引入复杂的头文件时(那将是提升)。

当你提到VS时,我发现项目中包含文件的数量,特别是include路径的大小,似乎影响了Visual C ++的编译时间,远远超过了g ++的编译时间。 特别是大量嵌套包含的情况(再次,boost会这样做),因为需要大量的文件搜索才能找到源代码所需的所有包含文件。 将代码组合到单个源文件中意味着编译器可以更加智能地查找所述包含,并且显然更少找到它们,因为您可能期望同一子项目中的文件可能包含非常相似头文件集。

C ++开发的“大量编译单元​​”方法通常来自于要求解耦类和最小化类之间的依赖关系,因此编译器只需重建最小的文件集,以防您进行任何更改。 这通常是一种很好的方法,但在子项目中通常不太可行,因为那里的文件之间存在依赖关系,所以无论如何你最终都会进行大规模的重建。

我不认为减少编译单元的数量是一个好主意。 你正试图用大的编译时间解决问题,这种方法似乎有助于它,但你得到的另外:

  1. 在开发期间增加编译时间。 通常开发人员一次修改几个文件,对于3-4个小文件然后对于一个非常大的文件,编译可能会更快。
  2. 正如你所提到的,更难以导航代码,恕我直言这是非常重要的。
  3. 您可以在一个.cxx文件中包含的.cpp文件之间产生一些干扰:

    一个。 通常的做法是在cpp文件中本地定义(用于调试版本)宏新的内存泄漏检查。 不幸的是,在使用placement new包含头文件之前无法做到这一点(如某些STL和BOOST头部那样)

    通常的做法是在cpp文件中添加声明。 使用您的方法,这可能会导致标题出现问题,稍后会包含在内

    C。 名称冲突更可能发生

恕我直言,更加清洁(但可能更昂贵的方式)加快编译时间是使用一些分布式构建系统。 它们对于清洁构建尤其有效。

我不确定这是否与您的情况相关,但也许您可以使用声明而不是定义来减少您必须执行的#include的数量。 此外,也许你可以使用pimpl习语来达到同样的目的。 这有望减少每次需要重新编译的源文件数量以及必须提取的标头数量。

更大和更少的翻译单元不利用并行编译。 我不知道你使用的编译器和平台是什么,但并行编译多个翻译单元可能会大大减少构建时间......

这个概念被称为统一构建

从sharptooths帖子开始,我倾向于详细检查结果可执行文件。 如果它们不同,我倾向于限制您的技术来调试构建并使用主要版本构建的原始项目配置。 检查可执行文件时,我还会查看启动时和运行时的内存占用和资源使用情况。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM