转载自 酷勤网 http://www.kuqin.com/language/20090405/44306.html
前一阵子公司有个项目,要移植一个软件,代码量在10万行左右,基本的规划是,将公用代码制作成lib,然后按照需要,用不同的工程生成dll,或者exe。结果,其中有一个程序,原先的代码,使用/mt编译,生成的执行文件大小是160K左右,而我们的代码,生成的执行文件是460K。偏偏这个执行文件对执行文件大小要求还是蛮高的,同样的代码,为什么我们的代码生成的执行文件偏偏大好多呢。原因有几点。
1. 编译工具不同.
原先的代码是vc6工程,而现在的代码是vc2005工程,2005的cpp运行库要比vc6的新很多,个头也大很多,测试下来,同样的代码2005的执行文件比vc6的执行文件大30K左右.在这里我说一下对vs2005的评价,个头大,编译速度慢,生成的执行文件偏大,比vc6差多了,执行效率没有比较,但是和原先的程序比较,开始是慢,后来经过人工优化,有改进,和原先代码基本持平. 如果说对c++标准支持更好的话,我宁愿用gcc的windows移植版,比2005小很多,而且免费,没有版权问题.
2. 模版的滥用
不可否认,模版是现在c++编程中一个最闪光的地方,但是同样的问题,模版用多了,代码就膨胀.一个模版代码,例如vector, 相关的有allocator, iterator,const iterator等一系列的代码,而我们的代码用了太多的vector,map和智能指针,生成的执行文件中,模版代码占很大一块.
3. cpp对象编程
原先的代码,基本上用的是全局函数和变量,或者是static变量,而我们基本上都进行了类封装,尽量避免有全局函数和变量,这就有个问题,通过c++的类编程,把一些代码不可避免的耦合在了一起.
例如:
2
3 void funca()
4 {
5 a = 0;
6 }
7
8 void funcb()
9 {
10 a = 1;
11 }
如果进行类分装
2 public:
3 int a;
4 void funca()
5 {
6 a = 0;
7 }
8 void funcb()
9 {
10 a = 1;
11 }
12 };
2 void test()
3 {
4 ctest lc;
5 lc.funca();
6 }
同样在lib中使用的话,很难保证 funcb的代码不在你的执行文件中出现,你的执行文件中可能会有很多永远不会运行的僵尸代码.
4. 库的滥用
现在c++有很多现成可用的库,象boost, ace等,但是在用的时候要有个取舍.比如我们的程序有个多字节到unicode的转换要求,一开始用的是iconv这个库,在发现程序太大之后,改用windows api实现, 程序一下子小了700K.这个例子太极端了,但是确实如此, 用一个库,可能程序多个几十K,多用几个,执行文件就在不知不觉中大了好多.如果相同的功能,有api可以很快速的实现的话,还是用api实现的好.
写到这里想起以前linux Torvalds对c++表达过的不满,c++确实因为特性太多而过于复杂,如果用的不好的话,会有很多负面效应.
大腕里面李成儒有段经典的话,现在有些人也是这样的,oo啊,智能指针啊,boost牛库啊,设计模式啊,能用的都用上,如果只用c写程序,都不好意思和人打招呼.c就象只有一把小刀,而c++象个有从小刀到数控机床的车间,是杀鸡用牛刀,还是一蹴而就,最最关键的,还是使用这些工具的人.