压缩.cpp文件的缺点



在MSVC++中编译"静态库"项目时,我经常会得到几MB大小的.lib文件。如果我在编译时使用条件宏和include指令将所有.cpp文件"压缩"在一个.cpp文件中,则.lib文件大小将显著减小

这种做法有缺点吗?

Unity构建的主要问题是它们破坏了C++的工作方式。

在C++中,经过预处理的源文件被称为翻译单元。一些符号是这个翻译单元的"私有"符号:

  • 在命名空间级别声明为static的符号
  • 在匿名命名空间中声明的任何内容

如果合并多个C++文件,则编译器将在合并在一起的所有文件中共享这些专用符号,因为从其角度来看,这已成为单个翻译单元。

如果两个局部类突然具有相同的名称,并且常量为幂等,则会出现错误。虽然很烦人,但至少你得到了通知。

但是,对于函数,它可能会因为过载而静默地中断。在编译器为您对launch(1)的调用选择static void launch(short u);之前,它会突然切换到static void launch(int i, Target t = "Irak");哎哟

Unity Builds很危险。您正在寻找的是WPO(全程序优化)或LTO

缺点是,如果更改cpp中的一行,则必须编译整个代码。

您的文件可能会变得更加复杂,即使只更改一个源文件,也必须重新编译所有内容。除此之外,在合并所有内容时(例如,由于一个翻译单元中有多个定义),除非文件重新定义了可能会让你出错的局部函数或变量,否则没有真正的缺点。

您注意到的大小减少是由于以这种方式提供的高级优化(例如重用更多代码)。根据您的代码,通过启用所有大小优化以及链接时间优化,您可能会得到类似的结果,这可能会在两种方法之间产生一些可接受的解决方案。

将cpp包含在另一个cpp中通常是一种令人困惑的做法(至少您应该留下解释性的注释,说明为什么要这样做)。

最新更新