UML+OOPC嵌入式C语言开发精讲
上QQ阅读APP看本书,新人免费读10天
设备和账号都新为新人

1.3 基于Visual C++环境的评估

在Visual C++环境里的C程序加上美好的面向对象机制,需要付出多少代价呢?答案是平均一个类增加0.25KB(即250 Bytes)左右,即使你的程序含有10个类(这已经是大系统了),也不过增加2.5KB左右。我们来看一个例子,如下代码所示。

          /*  Win32_EX01_01.c   这是一个ANSI-C程序  */
          #include "stdio.h"
          double radius;
          double length, width;
          void init_circle()
          { radius = 10.5; }
          void pr_area_circle()
          { printf("AC = %f\n", 3.14 * radius * radius); }
          void pr_perimeter_circle()
          { printf("PC = %f\n", 2 * 3.14 * radius);  }
          /* --------------------------------------------------- */
          void init_rect()
          { length = 10.5; width = 5.125; }
          void pr_area_rect()
          { printf("AR = %f\n", length * width); }
          void pr_perimeter_rect()
          { printf("PR = %f\n", 2 * (length + width)); }
          extern void* LightNew();
          void main()
          {
            init_circle();
            pr_area_circle();
            pr_perimeter_circle();
            init_rect();
            pr_area_rect();
            pr_perimeter_rect();
            getchar();
            return;
          }

此程序产生一个Win32_EX01_01.exe执行文件,其大小如图1-10所示。

图1-10

这个程序在Visual C++IDE上编译及连接之后,执行文件的大小为28.0KB,我们将以这个范例作为评估的基准,来算出增加两个类所必须付出的代价。现在就来配上LW_OOPC并规划两个类,其程序代码如下:

    // Win32_EX01_01.c
    #include "stdio.h"
    #include "lw_oopc.h"
    /* ----------------------------------- */
    INTERFACE(IA)
    {
      void (*init)(void*);
      void (*print_area)(void*);
    };
    CLASS(Circle)
    {
      IMPLEMENTS(IA);
      void (*print_perimeter)(Circle*);
      double radius;
    };
    static void init_circle(Circle *t)
    {
      t->radius = 10.5;
    }
    static void pr_area_circle(Circle *t)
    {
      printf("AC = %f\n", 3.14 * t->radius * t->radius);
    }
    static void pr_perimeter_circle(Circle *t)
    {
      printf("PC = %f\n", 2 * 3.14 * t->radius);
    }
    CTOR(Circle)
      FUNCTION_SETTING(IA.init, init_circle)
      FUNCTION_SETTING(IA.print_area, pr_area_circle)
      FUNCTION_SETTING(print_perimeter, pr_perimeter_circle)
    END_CTOR
    /* ----------------------------------- */
    CLASS(Rectangle)
    {
      IMPLEMENTS(IA);
      void (*print_perimeter)(Rectangle*);
      double length, width;
    };
    static void init_rect(Rectangle *t)
    {
      t->length = 10.5;  t->width = 5.125;
    }
    static void pr_area_rect(Rectangle *t)
    {
      printf("AR = %f\n", t->length * t->width);
    }
    static void pr_perimeter_rect(Rectangle *t)
    {
      printf("P = %f\n", 2*(t->length + t->width));
    }
    CTOR(Rectangle)
      FUNCTION_SETTING(IA.init, init_rect)
      FUNCTION_SETTING(IA.print_area, pr_area_rect)
      FUNCTION_SETTING(print_perimeter, pr_perimeter_rect)
    END_CTOR
    /* ------------------------------------------------- */
    extern void* LightNew();
    void main()
    {
      IA *pc = (IA*)CircleNew();
      IA *pr = (IA*)RectangleNew();
      pc->init(pc);
      pc->print_area(pc);
      pr->init(pr);
      pr->print_area(pr);
      getchar();   return;
    }

此程序产生一个Win32_EX01_01.exe执行文件,其大小如图1-11所示。

图1-11

此程序大小为28.5KB,因为加入两个类而增加了0.5KB,平均每个类增加0.25KB。