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

转自:http://www.cppblog.com/woaidongmao/archive/2009/10/19/98920.aspx

我再次强调,完全脱离编程环境的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 已经打开,注意, VS2005 VS2008 Windows 98 优化那一项没用,不像 VC6 取消 Windows 98 优化可以大大减小体积。因为 VS2005 VS2008 中段大小已经是 512 字节, VC6 默认 4K  

高级:  
    
指定入口点, 可以大大减小程序体积 ,但是不调用 CRT 的入口无法自动处理参数,可用 GetCommandLine CommandLineToArgvW 这两个 API 来处理参数。  
    
随机基址:默认模式启用映像随机化 (/DYNAMICBASE) ,会大大增加程序体积,因为这是个增加程序防反编译、防破解能力的选项。如无需求,请选择禁用映像随机化 (/DYNAMICBASE:NO) 文件越大,体积缩小越明显,至少30%  

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

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

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

你可能感兴趣的:(VC2008中影响exe大小和速度的全部编译选项)