上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。