统一构建的好处/缺点是什么?

32

自从我加入了这家新公司,我注意到他们大部分解决方案都使用Unity CPP文件。我想知道是否有人能够明确说明为什么以及如何加快构建过程?我原本认为编辑Unity文件中的一个CPP文件将强制重新编译所有文件。


5
请注意,使用Unity build会改变语义,因为有很多东西依赖于翻译单元的限制。 - David Thornley
3个回答

32

非常好的答案,非常感谢您的帮助。阅读了这些链接后,我仍然不清楚在单元cpp中编辑文件是否会强制重新编译整个源代码,对此有什么想法吗? - Stowelly
是的,会的。这是好事还是坏事取决于你已经有多少次需要进行完整重建了。 - Head Geek
2
如果一个文件发生了变化,任何像样的构建系统都会注意到已更改的依赖项并重新编译整个项目。您可以通过使用类似于优秀的ccache这样的编译器缓存来减轻一些时间 - 请参见http://ccache.samba.org/。 - akent
1
日常开发肯定是最大的赢家,但与旧式构建相比,Unity Builds 可以快速发布构建。对于任何完整的重建,Unity Build 都是无可匹敌的选择。如果您有一个庞大的代码库,甚至可以将单个 Unity 文件拆分成几个较小的文件。再加上像 Incredibuild 这样的工具,您几乎不需要再等待构建了! - OJ.
1
C++11 的另一个技巧是使用“显式模板实例化”和“外部模板实例化”来大幅减少编译时间。extern 声明告诉编译器这些实例化发生在另一个翻译单元中,这意味着编译器不会在当前翻译单元中实例化指定的类。 - Mani Zandifar
1
假设您有足够的RAM,节省的不是磁盘I/O。文件缓存将在内存中保留所有第三方头文件。 链接器中冗余的解析/代码生成和后续的重复删除是导致C++构建变慢的原因。 - Trass3r

14

非常有用的文章。我最近注意到,在解决方案中对多个项目的文件进行多次更改可能需要花费长达半小时来构建(即使使用 incredibuild),但清理解决方案并从头开始构建只需要约 5 分钟,因此绝对存在许多有效的观点! - Stowelly
1
链接现在可以在这里找到:http://engineering-game-dev.com/2009/12/15/the-evils-of-unity-builds/。 - geometrian
@imallett 这个链接也失效了。 - glauxosdever
3
@glauxosdever 这个链接现在可以在这里找到:(https://engineering.leewinder.co.uk/the-evils-of-unity-builds-2dbb07c3cae7#.8jn4cupf9),如果再次失效,也可以在这里进行存档:(http://web.archive.org/web/20140719090927/http://www.altdev.co/2011/08/14/the-evils-of-unity-builds/)。 - geometrian
1
现在它在这里:https://engineering.leewinder.co.uk/2009/12/15/the-evils-of-unity-builds/ - wreckgar23

2

这是因为它可以节省冗余的工作,避免对依赖项进行重复的解析和编译。链接也更加复杂 - 你要么将所有导出放在一个对象(或少数几个对象)中,要么将其分别导出到大部分目标对象文件中。较少的对象会导致较少的I/O和减少的链接时间。根据您的设置,包含可能会成为一个问题 - 在我使用的“unity build”系统上,构建最终受限于CPU和/或内存。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接