C++ 在一些静态库中启用整个程序优化将显著增加库的大小!

C++ 在一些静态库中启用整个程序优化将显著增加库的大小!,c++,visual-studio-2010,optimization,protocol-buffers,C++,Visual Studio 2010,Optimization,Protocol Buffers,在VisualStudio2010中,我有一个C/C++静态库项目。当我在发布模式下打开选项整个程序优化时,我获得了一个超过90MB的.lib文件! 当我关闭此选项时,大小将减少到24 MB。 这个库包含数百个用proto buffer生成的类 我想知道为什么这个选项会增加尺寸? 在什么情况下我们必须关闭它 编辑:将MO更改为MB,感谢chrisaycock启用整个程序优化使链接器能够内联实现(*.cpp)文件中定义的函数。在许多地方内联相同的函数可以显著增加二进制大小。整个程序优化意味着只有在

在VisualStudio2010中,我有一个C/C++静态库项目。当我在发布模式下打开选项整个程序优化时,我获得了一个超过90MB的.lib文件! 当我关闭此选项时,大小将减少到24 MB。 这个库包含数百个用proto buffer生成的类

我想知道为什么这个选项会增加尺寸? 在什么情况下我们必须关闭它


编辑:将MO更改为MB,感谢chrisaycock

启用整个程序优化使链接器能够内联实现(*.cpp)文件中定义的函数。在许多地方内联相同的函数可以显著增加二进制大小。

整个程序优化意味着只有在链接阶段才能进行优化

静态库的大小不值得关注。在此模式下,静态库可能会充满最终优化/链接阶段所需的额外信息。如果您没有进行整个程序优化,那么在构建静态库之后,这些信息可能会被丢弃,但是当您进行优化时,这些信息必须保留到最后

而是查看最终可执行文件的大小。(可能还会增加,但不应该增加这么多。)

我想知道为什么会有这种选择 增加尺寸

因为您正在构建一个静态库,而不是一个可执行文件整个程序优化将大量优化留到链接时(而不是编译时)。因此,您的库包含未优化的“中间表示”,而不是汇编代码

在什么情况下我们必须改变它 走开


对于静态库,正如您刚刚发现的。

我认为没有理由禁用静态库的优化。它们的大小无关紧要。@Athari这不是大小问题;这是一个兼容的。请参阅本文的最后一段,讨论您打算提供给其他人的静态lib,这些人可能使用不同的编译器版本将它们链接到他们的项目。在这种情况下,出于兼容性原因,关闭WPO是有意义的,但是如果LIB仅用于内部使用,并且使用相同的编译器版本,那么WPO应该是好的,并且是有益的。(如果不是,我怀疑静态libs的选项是否存在。)MO=Mega-Octet,我认为这没有问题;您会发现库文件的大小对可执行文件的大小几乎没有影响。该库包含允许在链接时进行优化的信息。