分享

嵌入式系统C和C 语言实现性能比较

 t涂鸦 2012-06-13

有一种认识是说使用C++语言来构建的嵌入式系统应用程序和库运行速度慢而且体积庞大。增大的代码大小对于嵌入式系统而言意味着更多的CPU功耗和内存空间。下面分析常见的能影响C++性能的语言特性,并指出如果按照合理的原则规避昂贵的C++特性,那么在嵌入式系统C++可以和C一样快,内存和速度性能相似。

  • C++的很多特性代价很大,高级的面向对象的特性,如模板templates、使用class类代替基本的类型等特性让代码空间迅速膨胀。一般可以认为模板是美化的宏macros,每个模板实例都会产生代码,跟C语言中的宏定义类似,除了模板更类型安全;很多情况下会把模板类在头文件中inline内联,对于嵌入式应用,为了减少code size,可以不内联。模板template应用只对code size有重大影响,对实时性能影响不大;
  • 使用类的额外代码空间开销:如下例的C struct 和C++ class:

    class Foo {
    int m_a;
    int m_b;
    void doSomething();
    }

    struct bar {
    int a;
    int b;
    }

    void do_something_else();

    class类会增加额外的函数指针开销。

  • C++编译器会为一个函数产生很多的子程序,如构造函数、强制类型转换等。而C语言往往是一个C函数会被编译对应于一个底层汇编程序。这样C语言更方便优化,因为所见即所得。如果采用C++,就需要了解其基本特性,如声明一个类变量就意味着多余的初始化init()代码。还有C++中的类型转换type cast可能也是一个函数调用。
  • 虚函数实现和多态使得运行时链接runtime link和重定向relocation更为复杂。这使得C++应用程序加载运行都很慢。C程序只需要简单的链接(``Making C++ Ready for the Desktop",更多信息参考 http://www./~bastian/Export/linking.txt .),C++的虚函数实现会增加动态链接时查找合适的符号的启动时间,这对于需要动态链接的桌面应用是个问题,但是对于嵌入式实现,往往采用静态链接,所以动态链接时的符号查找并不存在。即如果虚函数中不存在运行时的类型选择和类型转换、采用
  • 每个类的虚实现都有一个附加的vtable数组,这会增加内存空间。虚函数的表格确实需要额外的内存开销,C实现往往采用函数指针或者switch case跳转形式,也需要额外的内存空间。如下所示
    switch (foo->type) {
    case CIRCLE:
    draw_circle(foo);
    break;
    case RECT:
    draw_rect(foo);
    break;
    case POINT:
    draw_point(foo);
    break;
    另外的实现如下函数指针形式:
    foo->fct_pointer=draw_circle;
    ...
    foo->fct_pointer(foo);
    C的switch case实现增加了代码空间,也增加了运行时间。函数指针的实现类似C++的虚函数实现。
  • C++的严格类型检查让写出可重用代码变得困难。想想C中常用的(void *)实现。
  • 运行时的类型检查和类型转换dynamic_cast<>从一个指针类型到另外一个类型,会增加存储和性能的额外开销,应尽可能的避免使用。
  • AFAIK异常exceptions在使用gcc编译时会增加额外开销,应避免使用异常处理,除非必须要异常处理;使能异常处理会增加编译器的处理时间,可以用错误代码的形式来代替异常的产生;

    嵌入式项目中使用C++的优势:

  • 全局和静态的对象会自动初始化,当应用程序启动时,就会自动调用ctors函数来初始化变量;这也就避免了变量没有初始化导致的运行错误;
  • 更加严格的类型检查;
  • 代码简明而易读;
  • 大量采用const关键字已充实代码意义;
  • 继承以及嵌套的继承inheritance并没有多少额外的开销,除了创建类的实例化对象需要额外的开销;
  • 通常情况下,动态内存分配会增加运行时开销。针对C++而言,一般需要重新定义new和delete函数来更好的适应嵌入式系统。如果使用动态内存分配,也要保证保证分配的可预期和无错;

http://www./pete/cppopt/main.htm

http://tech-mugunthkumar./2008/02/c-vs-cc-performance.html

http://houh-1984.blog.163.com/

有一种认识是说使用C++语言来构建的嵌入式系统应用程序和库运行速度慢而且体积庞大。增大的代码大小对于嵌入式系统而言意味着更多的CPU功耗和内存空间。下面分析常见的能影响C++性能的语言特性,并指出如果按照合理的原则规避昂贵的C++特性,那么在嵌入式系统C++可以和C一样快,内存和速度性能相似。

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多