#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
- debugging目标是否丢失?
- Android gradle build错误:(9,0)未findGradle DSL方法:'compile()'。
- Visual Studio 2010不重build更改的代码,除非我手动select“重build”
- 我可以在编译和链接中将C ++ main函数和类从Objective-C和/或C例程中分离出来吗?
- gem install json -v 1.7.3给出'请更新PATH以包含构build工具'
- 以编程方式发送到从界面构build器创build的前/后元素
- “构build服务器”有什么意义?
- 我如何使Visual Studio的构build非常冗长?
- TFS Build 2012中构build定义的`build agent folder` $(SourceDir)是什么?