VC2008中影响exe大小和速度的全部编译选项

#pragma comment(linker, "/OPT:nowin98")// VC6 中取消对98 的支持

#pragma comment(linker, "/SECTION:MiniPE,")// 创建自定义的 MiniPE Section

#pragma comment(linker, "/MERGE:.data=MiniPE")// 合并.data Section MiniPE Section

#pragma comment(linker, "/MERGE:.text=MiniPE")// 合并.text Section MiniPE Section

#pragma comment(linker, "/MERGE:.rdata=MiniPE")// 合并.rdata Section MiniPE Section

 

 

文章出处:http://topic.csdn.net/u/20091015/02/daf7c9db-1a7e-4a62-989d-d995a9894d78.html

 

我再次强调,完全脱离编程环境的C/C++ 学习方法,不是好的方法,现在所谓的环境中立理论就是“什么都不学”理论,VCGCC ,主流的就两个,精通其中一个就能吃遍天下,教材里就应该选择一个大讲特讲!

 

  作为VC 的代表,今天我给大家全面介绍VC 中的编译器选项,全面介绍不需要,MSDN 里从头到尾都介绍完了,今天我只讲对生成的exe 文件大小和速度有影响的。

 

  VC 就得用IDE ,我也以IDE 的工程设置里面的排列顺序介绍,某些选项需要自己手动添加的最后介绍,我后面说的默认值是release 的,debug 版本一般不需要调选项。

 

项目 - 属性 - 配置属性 - C/C++ ,这是编译器选项。

优化:

  通常,算法程序选择最大化速度(/O2) ,界面程序选择最小化大小(/O1) ,可以获得最佳的效果 。优选大小或速度,只有在使用完全优化(/Ox) 时才有效,完全优化一般不推荐使用,用处就是可以生成速度与/O2 基本相当,但是体积更小的代码(选速度优先的话)。

  其他几个选项实际上已包含在/O1/O2 之中,具体请看MSDN

 

代码生成:

  启用字符串池(/GF) :会将相同的字符串合并,当然可以减小空间占用,虽然本项目默认没有打开,但是默认的/Zi 选项会自动打开/GF ,这里打不打开一样。

  启用C++ 异常:该项默认打开,在C++ 项目中(比如MFC 中),会大大增加程序体积,增加约30% ,关闭并不代表try 不能用了,但会一定程度上降低健壮性,对于空间要求较高的程序,建议关闭。对于正式项目,请参见MSDN ,看看会不会造成不利影响。

  运行库:默认多线程DLL(/MD) ,体积最优的方案,如果对方没有VS 运行时库,选择/MT 会将C/C++ 运行库静态编译,体积增加不少,因此,我的选择一般是程序与redist 包一起发布,也就几M ,而且以后永远可以接受/MD 版本了。

  缓冲区安全检查:关闭的话,减少0.5K~1K 体积 (默认情况,VC 的段长度512 字节,因此程序体积变化的最小单位是0.5K )。

  启用增强指令集:真想用SSE3 的话去用Intel C++ VS2008 只支持到SSE2 ,而且,在我的机器上貌似使用默认设置就能达到选择SSE2 的相同速度,如果安装了Intel C++ 11 ,可集成与VS2008 ,同样的地方选择SSE3 效果超群。

  浮点模型:精确还是快速理论上肯定对速度有影响,但是我极少使用浮点编程,我的方向是系统、安全和密码,都是整数的天下。

 

高级:

  编译为C 还是C++ 影响不大 ,这充分说明了C++ 简单面向对象特性和C 效率差不多(如重载,默认情况下,编译器会检查扩展名决定目标代码类型,对于cpp 文件,所有的函数都会编译为可重载的类型,但是对效率几乎没有影响)。

 

项目 - 属性 - 配置属性 - 链接器,这是链接器选项。

输入:

  忽略库只有在库冲突时候才有用,VC 绝对不会连接没有调用到的库,哪怕你明确指定了。

 

清单文件:

  完全使用API 编程可以不生成清单 。减少约1K 体积。一般情况下,关闭UAC 的那一项,可减少0.5K

 

调试:

  关闭“生成调试信息(/DEBUG) ”,根据程序规模,可减少1K~ 几十K

 

优化:

  release 模式,默认情况下已经该组已经最优了,/OPT:REF/OPT:ICF 已经打开,注意,VS2005VS2008Windows 98 优化那一项没用,不像VC6 取消Windows 98 优化可以大大减小体积。因为VS2005VS2008 中段大小已经是512 字节,VC6 默认4K

 

高级:

  指定入口点,可以大大减小程序体积 ,但是不调用CRT 的入口无法自动处理参数,可用GetCommandLineCommandLineToArgvW 这两个API 来处理参数。

  随机基址:默认模式启用映像随机化(/DYNAMICBASE) ,会大大增加程序体积,因为这是个增加程序防反编译、防破解能力的选项。如无需求,请选择禁用映像随机化(/DYNAMICBASE:NO) ,文件越大,体积缩小越明显,至少30%

 

命令行:

  小程序,可以指定段大小/ALIGN/O1 编译的化最小可以使用/ALIGN:4 ,这个选项不推荐,第一有点规模的程序就不能用太小的段,/O2 优化的也不能用小段,而且默认的512 字节段可以使用UPX 压缩,再小就不能了,除非咱们编译那种600 字节的Hello World ,这个选项意义不大,因此微软才没有给他一个图形选项。

同样,编译600 字节hello world 还需要/merge 合并段选项,同样不推荐使用。

 

  有些选项VS2005VS2003 没有,VS2003 还包括几个VS2008 废除的选项,实际上VC 里面程序优化效率最高的个人感觉是VS2003VC6 的界面差别比较大,选项有一定差异,但毕竟都是微软的产品,差别不大,甚至于MASM 这个汇编编译器,连接选项大都与VC 相同……

 

  再说一点VS2008SP1MFC 工程会自动生成巨大的256*256 真彩图标,因此默认的MFC 对话框程序都有近100K ,建议删除多余的图标,配合上述选项能减到10K

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值