C 还是 CPP

转载自 酷勤网 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++的类编程,把一些代码不可避免的耦合在了一起.
  例如:

 1 int a;
 2   
 3   void funca()
 4   {
 5       a = 0;
 6   }
 7   
 8   void funcb()
 9   {
10       a = 1;
11   }
  上面的代码生成lib,如果我们只使用了funca, 则很显然,静态链接的时候, funcb是不会编译进执行文件.
 
  如果进行类分装
 1 class ctest{
 2   public:
 3       int a;
 4       void funca()
 5       {
 6         a = 0;
 7       }
 8       void funcb()
 9       {
10         a = 1;
11       }
12   };

1 而使用
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++象个有从小刀到数控机床的车间,是杀鸡用牛刀,还是一蹴而就,最最关键的,还是使用这些工具的人.


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值