![]() |
1
5
这种方法的一个显著缺点是每个翻译单元有一个.obj文件。 如果您创建一个静态库以便在其他项目中重用,那么如果您有多个大型转换单元而不是许多小型转换单元,那么在这些项目中您通常会遇到更大的二进制文件,因为链接器将只包含.obj文件,其中包含使用库的项目中真正引用的函数/变量。 对于大的翻译单元,更有可能引用每个单元并包含相应的.obj文件。在某些情况下,较大的二进制文件可能是一个问题。也可能有些链接器足够聪明,只包含必要的函数/变量,而不包含整个.obj文件。 此外,如果包含了.obj文件,并且也包含了所有全局变量,那么当程序启动/停止时,将调用它们的构造函数/析构函数,这肯定需要时间。 |
![]() |
2
4
|
![]() |
3
3
将大量C++源代码文件捆绑到单个文件中是最近几次提到的一种方法,尤其是当人们正在构建大型系统并拉入复杂的头文件(这将是一种提升)。 正如您提到的VS一样,我发现项目中包含文件的数量,尤其是包含路径的大小,似乎对Visual C++的编译时间的影响远远大于对g++编译时间的影响。对于大量嵌套的include(boost也是这样做的),尤其如此,因为要查找源代码所需的所有include文件,需要进行大量的文件搜索。将代码合并到一个源文件中意味着编译器可以更智能地查找所述包含,而且可以找到的包含明显较少,因为您可以预期,同一子项目中的文件可能包含一组非常相似的头文件。 对C++开发的“大量编译单元”通常来自于对类进行解耦并最小化类之间的依赖关系,因此编译器只需重建最小的文件集,以防发生任何更改。这通常是一种很好的方法,但通常在子项目中并不切实可行,因为其中的文件相互依赖,因此最终将进行相当大的重建。 |
![]() |
4
3
|
![]() |
5
2
我不确定这是否与您的情况相关,但也许您可以使用声明而不是定义来减少
|
![]() |
6
1
较大和较小的翻译单元不会利用并行编译。我不知道您使用的是什么编译器和什么平台,但在并行多个翻译单元中编译可能会显著减少构建时间。。。 |
![]() |
7
1
这个概念叫做 unity build |
![]() |
8
0
|
![]() |
Gergely Tomcsányi · 内部类和封闭类的单独定义 7 年前 |
![]() |
Qaribullah Khan Yousafzai · 模板类和派生类 7 年前 |
|
Ankur Singh · 类的转发声明:语法错误 7 年前 |
![]() |
Arctic Pi · C-将代码正确地划分为多个文件 8 年前 |
![]() |
Mish · 在另一个类中创建的对象的C++数组 8 年前 |