1、第一级优化: 使用vc动态运行库,而不是默认的静态库
如果使用静态库的话,几乎所有你用到的和默认用到的C运行库函数代码都要加到你的EXE文件中去,这样你的程序就会变大。而动态运行库就没有这个问题,动态库的主要问题是动态库是孤立的,要保证它的存在, msvcrt.dll 就是vc6的C运行库,而且已经是Windows的
系统DLL的一部分了,很多程序都在用,所以这个
问题也不用考虑了。
本级优化的方法是:
menu->project->settings,"c/c++" 页,category下拉筐中的"Code Generation" 项,将 "Use run-time libray" 更改为 Multithread Dll 或 Debug Multithread Dll。
也可以直接改编译参数:将 /ML 项改为 /MD 或 /MDd
经过本级优化,你会发现你的helloworld.exe,debug版只有29K, release版的只有16K。
2、第二级优化: 使用release版的修改版来调试你的程序
release版与debug版的主要区别是,release版经过了代码优化,里面不含有用来调试程序的信息数据。
debug版大一方面是因为含有调试符号,还有一个主要原因是连接器没有对它作代码依赖性的优化,也就是没有删掉那些完全用不到的代码。不管三七二十一,连接器把你所用的Lib的代码差不多都给加了进去。
本级优化的方法是:
menu->Build->Configurations,选择"Win32 Debug" 项,点 "Remove"删掉它(你保留着也行),然后点"Add"按钮,Configuration 名称改为 DebugEx, Copy settings from 选择 * - Win32 Release , 确定后你就多了一个 DebugEx 版的配置。
menu->Build->Set Active Project Configuration,选择你新加的 DebugEx 项。
menu->project->settings,"c/c++" 页,category下拉筐中"General" 项,将 "Optimizations" 更改为 Disable(Debug); "Debug info" 更改为
"Program Database" ; Preprocessor definitions 中的 NDEBUG 这个宏删掉或替换成 _DEBUG 。
menu->project->settings,"Link" 页,"Debug" 项,将 "Debug info" 那个复选框打上钩,默认 Microsoft format.
经过本级优化,你会发现你的helloworld.exe,DebugEx版只有17K,与release差不多。
3、第三级优化: 使用一些高级连接参数使你的程序更小
这中间涉及到PE文件格式中的一些概念,我这里只是简单说一下,如果你有兴趣可以找找相关资料看看。
Windows 的可执行文件使用 PE 文件结构。
PE文件的结构简单的说就是 一个 Dos桩文件 + PE 文件头 + PE数据节(Section)1 + PE数据节2 ......
VC编出来的
程序文件中的 Dos桩文件 很小,只有几十个字节,就是打印一句话“This program cannot be run in DOS mode”,如果你想改变它可以用 /STUB:filename 参数来改变。
PE 文件头中有很多参数,我们只关心 Section Alignment,File Alignment 这两项,VC的默认设置好像都是4K, File Alignment的这个值比较大,因
为Section通常不是接近4K,这样就会有冗余,VC会用0来填补。 这个参数我们要改, /ALIGN:number number必须是512的2的幂的整数倍,如512, 4096等等。然而根据我验证的结果好像只要这个值是VC认可的值,其Section Alignment值就是你指定的值,File Alignment 就是1024,所以我们设成 /ALIGN:4096 就行了,这样段大小与内存的区块大小也是一致的。
另外,我们可以合并一些区段,这样可以更加节省空间。
/MERGE:.rdata=.text /MERGE:.data=.text /SECTION:.text,ERW
以上参数就是把只读数据段.rdata和可写数据段.data都合并到代码段.text中,为了能写入到原来可写数据段的数据,还要把代码段.text的数据改为可读,可写,可执行
本级优化的方法是:
menu->project->settings,"Link" 页,category下拉筐中"Debug" 项, "Project Options" 中增加以下参数
/align:4096 /MERGE:.rdata=.text /MERGE:.data=.text /SECTION:.text,ERW
经过本级优化,你会发现你的