嵌入式C++——关于C++的效率分析 |
顶嵌|嵌入式培训|嵌入式Linux培训|承接嵌入式项目开发 2009-02-26 09:47:02 作者:顶嵌开源 来源:原创 文字大小:[大][中][小] |
C++给我们带来了面向对象的支持,近年来在大型的嵌入式项目中经常被采用,甚至有一些较新的操作系统如eCos,Symbian等都采用C++编写。不过C++在带来一些便利的同时,也引入了很多昂贵的特性。随着在嵌入式开发领域使用C++作为开发语言的公司和项目越来越多,有不少原来工作在桌面开发领域的C++程序员加入了嵌入式开发的阵营。对于这些由桌面开发转入嵌入式开发中的C++开发来说,需要特别注意程序的效率和资源占用情况,了解哪些C++特性可能带来执行时间和代码大小上的昂贵开销,并在有可能的情况下避免使用。
C++中引入了类的概念,以利于对象的封装,这在嵌入式开发中是完全可以利用的,与C语言中的struct相比,类几乎没有多少更大的开销。公有和私有成员数据及函数的列表与一个 struct 及函数原型的列表没有大的差别。C++编译器能够用public 和 private 关键字决定,哪一个方法调用和数据访问是允许的或者是不允许的,但这个决定在编译的时候完成,所以运行时不会付出代价。单纯的加入类既不会影响代码的大小,也不会影响你的程序的效率,而且还能够有利于对象的封装。
默认参数值也是没有损失的。编译器只是加入代码使得在每次函数被无参数调用的时候传递一个默认的值。类似地,函数名的重载也是编译时的修改。具有相同名字但是不同参数的函数在编译过程中分别分配了一个唯一的名字,每次函数名出现在程序中的时候编译器就替换它,然后连接器正确的把它们匹配起来。这些都几乎不会带来运行时的开销,唯一的缺点是符号表稍微复杂一些。操作符的重载与此类似,几乎没有运行时的开销。
构造函数和析构函数会带来一点损失。这些特殊的方法去分别保证每次这种类型的对象在创建或者超出了范围时被调用。然而,这个小量的开销是为减少错误而支付的一个合理代价,是可以被接受的。类似的,虚拟函数也具有一个合理的代价收益比。它的明显代价是在调用虚拟函数之前附加了一个存储查询,而普通的函数和方法调用是不受影响的。由于它是实现多态的基础,且代价比较小,是可以接受的。
根据一般的经验,比较昂贵的C++特性有模板、异常事件及运行类型识别。这三个特性都对代码的大小有负面的影响,而且异常事件和运行时类型识别还会增加执行时间。在决定是否使用这些特性之前,你可能要做一些实验来看看它们会怎么样影响你自己的应用程序的大小及速度。
事实上,在嵌入式软件界对于C++是否值得所产生的性能损失的问题一直存有很大的争议。在1996 年,一群日本的芯片厂商联台起来定义了一个C++语言和库的子集,使它更加适合嵌入式软件开发。他们把他们新的工业标准叫作嵌入式C++。作为一个C++标准草案的合适子集,嵌入式C++省略了很多不限制下层语言可表达性的任何可以省略的东西。这些被省略的特性不仅包括像多重继承性、虚拟基类、运行时类型识别和异常处理等昂贵的特性,而且还包括了一些最新的添加特性,比如:模板、命名空问、新的类型转换等。所剩下的是一个C++的简单版本,它仍然是面向对象的并且是C 的一个超集,但是它具有明显更少的运行开销和更小的运行库。对嵌入式C++有兴趣的读者可以到这里查看Embedded C++的详细定义(Specification):http://www.caravan.net/ec2plus/spec.html。
|