从Visual Studio 2008升级到Visual Studio 2013时,二进制大小增长了30%

Uri*_*Uri 5 c++ visual-c++ visual-studio-2013

我要用多个项目来维护一个庞大的,旧的代码库(不是由我编写的),其中大多数都是用C++编写的.我的第一步是将代码库从VS 2008升级到VS 2013.

两种解决方案都设置为针对大小进行优化(在发布版本中).然而,二进制大小现在大约增加了30%,几乎在所有二进制文件中 - 我很难解释.

这些项目大量使用ATL,我知道ATL 9转移到静态库,但我怀疑这解释了所有的大小差异.

任何想法:

  1. 尺寸差异的解释是什么?VS12是否更安全或由于尺寸变化而具有更好的性能(寻找出售此开关的"关键点").

  2. 寻找减少二进制大小的方法,从低挂果到更精细的工作.

Win*_*ute 4

假设您静态链接 MFC:

解决方案

#define _AFX_NO_MFC_CONTROLS_IN_DIALOGS
Run Code Online (Sandbox Code Playgroud)

在顶部stdafx.h,或添加_AFX_NO_MFC_CONTROLS_IN_DIALOGS到项目设置中的预处理器定义。

解释

MSVC 2010 包含大量新的扩展控件(其中大多数与功能区相关,但也有CMFCButton其他内容。MSVC 2008 也有一个功能包)。这些新控件可以通过资源编辑器添加到对话框中,就像旧的 Windows 控件一样。

为了完成这项工作,解析 RC 文件1 的代码需要了解所有新的 MFC 控件类。如果动态链接 MFC,这不是问题,但如果静态链接它们,则意味着 MFC 的所有闪亮新部分都将链接到您的应用程序中,无论您是否使用它们。因此,我的二进制大小是三倍。

很快,这个问题就变得比微软人想象的还要严重。静态链接 MFC 显然比他们预期的更常见。在 MSVC 2010 中解决这个问题仍然很痛苦,但在下一个版本中,引入了一种机制来禁用新功能:_AFX_NO_MFC_CONTROLS_IN_DIALOGS预处理器宏。如果它是在包含任何 MFC 标头之前定义的,则 RC 解析器代码不会处理新控件,并且不会引入对它们的依赖项。请注意,这意味着无法通过资源编辑器将新控件添加到对话框中。

有关问题和解决方案的更详细的技术描述可以在这篇 MSDN 博客文章中找到。

1是的,我在这里掩盖了一些细节。