C++ 团结的好处/坏处是什么?

C++ 团结的好处/坏处是什么?,c++,build-process,compilation,C++,Build Process,Compilation,自从在一家新公司成立以来,我注意到他们在我们的大多数解决方案中使用unity cpp文件,我想知道是否有人能给我一个明确的原因,说明为什么以及如何加快构建过程?我原以为在unity文件中编辑一个cpp文件将强制重新编译所有cpp文件。这里有非常相似的问题和很好的答案: 总结看来,减少I/O开销是主要的好处 也请参见上述问题中的链接。李·温德发布了他在Unity Builds中的经验- 他的结论是: 团结建立。我不喜欢他们 这是因为它节省了多余的工作。依赖项的冗余解析和编译。链接也要复杂得多——要

自从在一家新公司成立以来,我注意到他们在我们的大多数解决方案中使用unity cpp文件,我想知道是否有人能给我一个明确的原因,说明为什么以及如何加快构建过程?我原以为在unity文件中编辑一个cpp文件将强制重新编译所有cpp文件。

这里有非常相似的问题和很好的答案:

总结看来,减少I/O开销是主要的好处


也请参见上述问题中的链接。

李·温德发布了他在Unity Builds中的经验-

他的结论是:

团结建立。我不喜欢他们


这是因为它节省了多余的工作。依赖项的冗余解析和编译。链接也要复杂得多——要么将所有导出都放在一个(或几个)对象中,要么在目标的大多数对象文件中单独进行冗余导出。对象越少,I/O越少,链接时间越短。根据您的设置,包含可能是一个问题——在我使用的“unity build”系统上,构建最终会受到CPU和/或内存的限制。

回答很好,非常感谢您的帮助,在阅读这些链接后,如果在单位cpp中编辑文件会强制重新编译整个源代码,我仍然不知道这一点,对此有什么想法吗?如果一个文件发生了变化,任何合适的构建系统都会注意到一个变化的依赖项,并重新编译该文件。您可能可以使用编译器缓存(如优秀的ccache)来减少一些时间——请参阅,虽然日常开发人员无疑是大赢家,但与旧式版本相比,Unity版本更适合快速发布版本。对于任何完整的重建,你都无法击败一个统一的建设。如果您有一个较大的代码库,您甚至可以在单个unity文件中分解为几个较小的代码库。将它与类似于IncredBuild的东西结合起来,您几乎不必再等待构建了!c++11的另一个技巧是,可以使用和“外部模板实例化”显著减少编译时间。extern向编译器保证实例化发生在另一个翻译单元中。这意味着编译器不会在当前的翻译单元中实例化指定的类。如果您有足够的RAM,那么节省不是因为磁盘I/O。文件缓存会将所有第三方头保存在内存中。链接器中的冗余解析/代码生成和随后的重复删除是C++的生成缓慢的原因。记住,Unity构建会改变语义,因为有很多依赖于翻译单元的限制的东西。非常有用的文章。我最近注意到,在解决方案中跨多个项目对文件进行几次更改可能需要半个小时才能构建(即使使用IncredBuild),但清理解决方案和从头构建大约需要5分钟,因此肯定有很多有效点!现在可以找到链接了。@imallett链接也断开了。@glauxosdever现在可以找到链接,并将其存档,以防再次断开。现在