#include所有.cpp文件到一个编译单元中?

我最近有理由使用通常的debugging和发布configuration的一些Visual Studio C ++项目,但也是“全部释放”和“全部debugging”,这是我以前从未见过的。

事实certificate,项目的作者有一个单独的ALL.cpp,其中包括所有其他的.cpp文件。 *所有configuration只是build立这一个ALL.cpp文件。 当然,排除在常规configuration之外,常规configuration不会build立ALL.cpp

我只是想知道这是否是一种常见的做法? 它带来了什么好处? (我的第一反应是它闻起来不好。)

你会遇到什么样的陷阱? 我能想到的一点是,如果你的.cpps中有匿名命名空间,那么它们不再是“私有”的cpp,而是现在可以在其他cpp中看到呢?

所有的项目都build立DLL,所以匿名命名空间中的数据不是一个好主意,对吗? 但function可以吗?

干杯。

它被一些(和谷歌)称为“统一build设”。 它非常快速地联系起来,并且合理地快速编译。 对于不需要迭代的构build来说,这非常棒,就像从中央服务器构build版本一样,但不一定需要增量构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提高了构build速度,主要有三个原因。 第一个原因是所有的共享头文件只需要被parsing一次。 许多C ++项目都有很多头文件被大多数或全部CPP文件包含,冗余parsing是编译的主要代价,特别是如果你有很多短源文件。 预编译的头文件可以帮助这个代价,但是通常有很多头文件没有被预编译。

Unity构build的下一个主要原因是提高了构build速度,因为编译器被调用次数更less。 调用编译器有一些启动成本。

最后,冗余头parsing的减less意味着内联函数冗余代码的减less,因此目标文件的总大小更小,这使得链接更快。

Unity构build也可以提供更好的代码。

由于减less了磁盘I / O,Unity版本不会更快。 我用xperf来描述许多构build,我知道我在说什么。 如果您有足够的内存,那么操作系统磁盘caching将避免冗余I / O – 后续的标题读取将来自操作系统磁盘caching。 如果你没有足够的内存,那么统一编译甚至会使编译器的内存占用超过可用内存并分页,从而使编译时间变得更糟。

磁盘I / O是昂贵的,这就是为什么所有操作系统积极caching数据以避免冗余磁盘I / O。

我想知道ALL.cpp是否试图把整个项目放在一个单独的编译单元中,以提高编译器优化程序大小的能力?

通常,某些优化只能在不同的编译单元中执行,例如删除重复的代码和内联。

这就是说,我似乎记得最近的编译器(微软,英特尔,但我不认为这包括GCC)可以在多个编译单元中进行这种优化,所以我怀疑这个“技巧”是不必要的。

也就是说,看看有没有什么区别是很好奇的。

我同意布鲁斯的观点 从我的经验来看,我尝试过为我的.dll项目中的一个项目实现了Unity Build,这些项目包含大量头文件和很多.cpp文件; 为了降低VS2010上的整体编译时间(已经用尽了Incremental Build选项),但并没有缩短编译时间,而是耗尽内存,Build甚至无法完成编译。

但是要补充; 我确实发现启用Visual Studio中的多处理器编译选项相当有助于缩短编译时间; 我不确定在其他平台编译器中是否有这样的选项。

除了布鲁斯·道森(Bruce Dawson)的出色答案之外 ,下面的链接还会带来更多有关统一build设的优点和缺点的见解 – https://github.com/onqtam/ucm#unity-builds