VC2008中影响exe大小和速度的全部编译选项(转)
我再次强调,完全脱离编程环境的
C/C++
学习方法,不是好的方法,现在所谓的环境中立理论就是
“
什么都不学
”
理论,
VC
、
GCC
,主流的就两个,精通其中一个就能吃遍天下,教材里就应该选择一个大讲特讲!
作为
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
的话去用
IntelC++
,
VS2008
只支持到
SSE2
,而且,在我的机器上貌似使用默认设置就能达到选择
SSE2
的相同速度,
如果安装了
IntelC++ 11
,可集成与
VS2008
,同样的地方选择
SSE3
效果超群
。
浮点模型:精确还是快速理论上肯定对速度有影响,但是我极少使用浮点编程,我的方向是系统、安全和密码,都是整数的天下。
高级:
编译为C还是C++影响不大,这充分说明了C++简单面向对象特性和C效率差不多(如重载,默认情况下,编译器会检查扩展名决定目标代码类型,对于cpp文件,所有的函数都会编译为可重载的类型,但是对效率几乎没有影响)。
项目 - 属性 - 配置属性 - 链接器,这是链接器选项。
输入:
忽略库只有在库冲突时候才有用,VC绝对不会连接没有调用到的库,哪怕你明确指定了。
清单文件:
完全使用API编程可以不生成清单。减少约1K体积。
一般情况下,关闭UAC的那一项,可减少0.5K。
调试:
关闭“生成调试信息(/DEBUG)”,
根据程序规模
,可减少
1K~
几十
K
。
优化:
release模式,默认情况下已经该组已经最优了,/OPT:REF和/OPT:ICF已经打开,注意,VS2005、VS2008中Windows98优化那一项没用,不像VC6取消Windows98优化可以大大减小体积。因为VS2005、VS2008中段大小已经是512字节,VC6默认4K。
高级:
指定入口点,
可以大大减小程序体积
,但是不调用
CRT
的入口无法自动处理参数,可用
GetCommandLine
和
CommandLineToArgvW
这两个
API
来处理参数。
随机基址:默认模式启用映像随机化
(/DYNAMICBASE)
,会大大增加程序体积,因为这是个增加程序防反编译、防破解能力的选项。如无需求,请选择禁用映像随机化
(/DYNAMICBASE:NO)
,
文件越大,体积缩小越明显,至少
30%
。
命令行:
小程序,可以指定段大小/ALIGN,/O1编译的化最小可以使用/ALIGN:4,这个选项不推荐,第一有点规模的程序就不能用太小的段,/O2优化的也不能用小段,而且默认的512字节段可以使用UPX压缩,再小就不能了,除非咱们编译那种600字节的HelloWorld,这个选项意义不大,因此微软才没有给他一个图形选项。
同样,编译600字节helloworld还需要/merge合并段选项,同样不推荐使用。
有些选项VS2005和VS2003没有,VS2003还包括几个VS2008废除的选项,实际上VC里面程序优化效率最高的个人感觉是VS2003。VC6的界面差别比较大,选项有一定差异,但毕竟都是微软的产品,差别不大,甚至于MASM这个汇编编译器,连接选项大都与VC相同……
再说一点,VS2008SP1的MFC工程会自动生成巨大的256*256真彩图标,因此默认的MFC对话框程序都有近100K,建议删除多余的图标,配合上述选项能减到10多K
项目 - 属性 - 配置属性 - C/C++,这是编译器选项。
优化:
代码生成:
高级:
项目 - 属性 - 配置属性 - 链接器,这是链接器选项。
输入:
清单文件:
调试:
优化:
高级:
命令行: