#include所有.cpp文件到一个编译单元中?
我最近有理由使用通常的调试和发布配置与一些Visual Studio C ++项目一起工作,但也有'全部释放'和'全部调试',这是我以前从未见过的。
事实证明,项目的作者有一个ALL.cpp,其中包含所有其他.cpp文件。 *所有配置只是建立这一个ALL.cpp文件。 它当然会排除在常规配置之外,并且常规配置不会构建ALL.cpp
我只是想知道这是否是一种常见做法? 它带来了什么好处? (我的第一反应是它闻起来很糟糕。)
你会遇到什么样的陷阱? 我能想到的一点是,如果你的.cpps中有匿名命名空间,那么它们不再是该“cpp”的“私有”,而是现在也可以在其他cpp中看到?
所有的项目都构建DLL,因此在匿名命名空间中使用数据不是一个好主意,对吗? 但功能会好吗?
干杯。
它被一些(和google-able)称为“Unity Build”。 它非常快速地链接并且合理快速地编译。 对于不需要迭代的构建而言,这非常棒,就像从中央服务器构建版本,但不一定需要增量构建。
这是一个PITA来维护。
编辑:这是第一个谷歌链接更多信息:http://buffered.io/posts/the-magic-of-unity-builds/
让速度更快的事情是,编译器只需要读取所有内容,编译出来然后链接,而不是为每个.cpp文件都做。
Bruce Dawson在他的博客上写了很多关于这个的文章:http://randomascii.wordpress.com/2014/03/22/make-vc-compiles-fast-through- parallel-compilation/
由于三个主要原因,Unity提高了构建速度。 第一个原因是所有的共享头文件只需要被解析一次。 许多C ++项目都有很多头文件被大多数或所有CPP文件包含,冗余解析这些是编译的主要代价,尤其是如果您有很多短源文件。 预编译头文件可以帮助解决这个问题,但通常有很多头文件没有预编译。
团结构建提高构建速度的下一个主要原因是因为编译器被调用次数更少。 调用编译器有一些启动成本。
最后,减少冗余头解析意味着减少内联函数的冗余代码,所以目标文件的总大小更小,这使得链接更快。
Unity构建也可以提供更好的代码。
由于减少了磁盘I / O,Unity build不会更快。 我用xperf描述了许多构建,我知道我在说什么。 如果您有足够的内存,那么操作系统磁盘缓存将避免冗余I / O - 后续的标题读取将来自操作系统磁盘缓存。 如果你没有足够的内存,那么编译器的内存占用就会超出可用内存并被分页出去,所以统一编译甚至会使编译时间变得更糟。
磁盘I / O很昂贵,这就是为什么所有操作系统都积极缓存数据以避免冗余磁盘I / O的原因。
我想知道ALL.cpp是否试图将整个项目放在一个编译单元中,以提高编译器优化程序大小的能力?
通常,某些优化只能在不同的编译单元中执行,例如删除重复的代码和内联。
也就是说,我似乎记得最近的编译器(微软,英特尔,但我认为这不包括GCC)可以在多个编译单元中进行这种优化,所以我怀疑这个“技巧”是不必要的。
也就是说,看看是否确实有什么区别会很好奇。
链接地址: http://www.djcxy.com/p/14973.html上一篇: #include all .cpp files into a single compilation unit?
下一篇: Performance of C++ vs Virtual Machine languages in high frequency finance