OOC与CPP生成代码大小对比
Posted on Sun, 15 May 2011 22:45:46 -1100今天做了一个简单的对比测试,看一下gcc模拟oo与g++生成代码(strip无用符号后)大小的比较
下面附上测试demo,先来OOC的
/* * test_Animals.c * * Created on: 2011-5-16 * Author: Jesse Meng [pingf0@gmail.com] */ #include "OOStd.h" CLASS(Animal){ char *name; STATIC(Animal) vFn talk; }; int Animal_reload(Animal *THIS,char *name){ THIS->name=ALLOC(strlen(name)+1); memcpy(THIS->name,name,strlen(name)); return 0; } int Animal_unload(Animal *THIS,void *PARAM){ FREE(THIS->name); return 0; } ASM(Animal,Animal_reload,Animal_unload,NULL,NULL) CLASS_EX(Animal,Cat){ STATIC_EX(Animal,Cat) }; static void Meow(Animal *THIS){ printf("Meow!My name is %s!\n",THIS->name); } int Cat_reloadSt(StAnimal *THIS,void *PARAM){ THIS->talk=(void *)Meow; return 0; } ASM_EX(Animal,Cat,NULL,NULL,Cat_reloadSt,NULL) CLASS_EX(Animal,Dog){ STATIC_EX(Animal,Dog) }; static void Woof(Animal *THIS){ printf("Woof!My name is %s!\n",THIS->name); } int Dog_reloadSt(StAnimal *THIS,void *PARAM){ THIS->talk=(void *)Woof; return 0; } ASM_EX(Animal,Dog,NULL,NULL,Dog_reloadSt,NULL) int main(){ Animal *a[]={ /////////////////////////// (void*)newDog("Jack"), (void *)newCat("Lily"), (void*)newDog("Mike"), (void *)newCat("Lucy"), // 100个,这里懒得写了,因为测试时是cccv的 ..... }; int i=0; //StAnimal *f=ST((Dog*)(a[0])); StAnimal *f=ST((Dog*)(a[0])); for(i=0;i<100;++i){ f->talk(a[i]); } for(i=0;i<100;++i){ //delDog((Dog**)&(a[i]),NULL); delDog((Dog**)&(a[i]),NULL); } return 0; }
下面来看下CPP的
#include <iostream> #include <string> using namespace std; class Animal { public: Animal(const string& name) : name(name) {} virtual void talk() = 0; const string name; }; class Cat : public Animal { public: Cat(const string& name) : Animal(name) {} virtual void talk() { cout<<"Meow!Myname is "+name<<endl; } }; class Dog : public Animal { public: Dog(const string& name) : Animal(name) {} virtual void talk() { cout<<"Woof!Myname is "+name<<endl; } }; int main() { Animal* animals[] = { /////////////// new Dog("Jack"), new Dog("Mike"), new Cat("Lily"), new Cat("Lucy"), // 这里同样100个 ..... }; for(int i = 0; i < 100; i++){ animals[i]->talk(); } for(int i = 0; i < 100; i++){ delete animals[i]; } return 0; }
尽管我已经将OOC-GCC写的足够简单了,但还是比CPP写出来稍长一点(感觉还好一般20行左右)
不过编译出来的我还是比较满意的,
上面两段代码输出一致,风格一致,都是最基本的形式.
类设计为一个基类,两个近似的继承类,100个任意继承类的对象.
先生成100堆对象,执行100次各对象的基本方法,然后逐一销毁.
实际测试后cpp编译出来的体积为32246,通过OOC-GCC宏出来仅为21518(而这里面还包括内存分配日志,时间测试等函数的调用)
这个多少有点出乎我的意料,因为OOC-GCC通过宏引入了相当多的辅助函数,比如上面的实际用到的关于对象辅助生成的函数应该至少有24个,而且每个体积也不小的.