tbwshc

tbw

  C++博客 :: 首页 :: 联系 :: 聚合  :: 管理
  95 Posts :: 8 Stories :: 3 Comments :: 0 Trackbacks

常用链接

留言簿(4)

我参与的团队

搜索

  •  

最新评论

阅读排行榜

评论排行榜

在决定写这本书的时候我面临的一个最大的问题是:是否把C++加入到讨论
中去。尽管我熟悉C++,但是我不得不用C 和汇编来写几乎所有我的嵌入式软件。而且在嵌入式软件界对于C++是否值得所产生的性能损失的问题存有很大的争议。一般认为C++程序会产生更大的代码,这些代码执行起来比完全用C写的程序要慢。然而,C++给于程序员很多好处,并且我想在这本书中讨论一些这样的好处。因此,我最终决定把C++加入到讨论中来,但是在我的例子中只是使用那些性能损失最小的特性。
我相信很多的读者在他们自己的嵌入式系统编程的时候会面对相同的问题。在结束这本书之前。我想简单地评判一下每一种我使用过的C++特性。并且提醒你一些我没有使用过的比较昂贵的特性。
当然,并不是每一件C++引入的事情都是昂贵的。很多老的C++tb编译器并入了一个叫作C.front 的技术,这项技术把C++的程序变成C,并且把结果供给标准的C 编译器。这个事实暗示这两种语言之间的句法差别很小,或与运行代价无关(注2)。只有最新的C++特性,如模板,不能够用这种方式处理。
比如,类的定义是完全有益的。公有和私有成员数据及函数的列表与一个struct 及函数原型的列表没有大的差别。然而,C++编译器能够用public 和private 关键字决定,哪一个方法调用和数据访问是允许的或者是不允许的。因为这个决定在编译的时候完成,所以运行时不会付出代价。单纯的加入类既不会影响代码的大小,又不会影响你的程序的效率。
默认参数值也是没有损失的。编译器只是加入代码使得在每次函数被无参数调用的时候传递一个默认的值。类似地,函数名的重载也是编译时的修改。具有相同名字但是不同参数的函数在编译过程中分别分配了一个唯一的名字。每次函数名出现在程序中的时候编译器就替换它,然后连接器正确的把它们匹配起来。我没有在我的例子中使用C++的这一特性,但是我这幺做过而没有影响性能。

操作符的重载是另一个我使用过但是没有包括在例子中的特性。无论何时编译器见到这样一个操作符,它只是用合适的函数调用来替换它。因此,在下面列出的代码,最后两行是等价的,性能的损失很容易明白:
Complex a, b, c;
c = operator+(a, b)
// The traditional way: Function Call
// The C++ way: Operator Overloading
构造函数和析构函数也有一点与它们相关的损失。这些特殊的方法去分别保证每次这种类型的tbw对象在创建或者超出了范围时被调用。然而,这个小量的开销是为减少错误而支付的一个合理代价。构造函数完整地删除了一个C 语言编程中与未初始化数据结构编程错误有关的类。这个特性也被证明是有用的,因为她隐藏了那些与像Timer 和Task 这样复杂的类相关的笨拙初始化顺序。
虚拟函数也具有一个合理的代价收益比。不要深究太多的关于什么是虚拟函数的细节,让我们只是说一下没有它们多态性就是不可能的。而没有多态性,C++就不可能是一个真正的面向对象的语言。虚拟函数唯一一个明显的代价是在调用虚拟函数之前附加了一个存储查询。普通的函数和方法调用是不受影响的。就我的体验来说太昂贵的 C++特性有模板、异常事件及运行类型识别。这三个特性都对代码的大小有负面的影响,而且异常事件和运行时类型识别还会增加执行时间。在决定是否使用这些特性之前,你可能要做一些实验来看看它们会怎么样影响你自己的应用程序的大小及速度。

posted on 2013-07-23 17:25 tbwshc 阅读(78) 评论(0)  编辑 收藏 引用

只有注册用户登录后才能发表评论。
网站导航: 博客园   IT新闻   BlogJava   知识库   博问   管理