在MSVC ++中编译“静态库”项目时,我经常会得到几MB大小的.lib文件。如果我在编译时使用条件宏并包含指令以“压缩”一个.cpp文件中的所有.cpp文件,则.lib文件大小会显着降低。
这种做法有什么缺点吗?
答案 0 :(得分:6)
调用 Unity Builds 的主要问题是它们打破了C ++的工作方式。
在C ++中,源文件及其包含预处理的文件称为翻译单元。有些符号是"私有"到这个翻译单位:
static
的符号如果您合并多个C ++文件,那么编译器将共享那些私有符号在所有合并在一起的文件中这个观点已成为单一翻译单位。
如果两个本地类突然具有相同的名称,并且常量的同义词,则会出现错误。很烦人,但至少你会收到通知。
但是对于函数,由于重载,它可能会无声地破坏。在编译器选择static void launch(short u);
来调用launch(1)
之前,突然它会转移到static void launch(int i, Target t = "Irak");
。 Oups?
Unity Builds 很危险。您正在寻找的是 WPO (整个程序优化)或 LTO (链接时间优化),查看编译器手册的内部以了解如何激活它。
答案 1 :(得分:4)
缺点是如果你在cpp中改变一行就必须编译整个代码。
答案 2 :(得分:1)
您的文件可能会变得更复杂,即使您只更改了一个源文件,也必须重新编译。除此之外,没有真正的缺点,除非文件正在重新定义本地函数或变量,这可能会使你陷入困境,合并所有内容(例如,由于一个翻译单元中的多个定义)。
您注意到的大小减少是由于以这种方式可用的高级优化(例如,重用更多代码)。根据您的代码,您可以通过启用所有大小优化和链接时间优化来获得类似的结果,这可能会在两种方法之间产生一些可接受的解决方案。
答案 3 :(得分:1)
将cpp包含在另一个cpp中通常是一种令人困惑的做法(至少你应该留下关于你为什么这样做的解释性评论)。