今天面试被问到一个类的内存问题,有些记不清楚了。用了 C++这么年,实在是不该该。面试
因而上网查了一些资料,并作了实验,整理以下:函数
所用测试环境为64位mac air,编译器为XCode测试
1.最简单this
class Test { public: int a ; };
printf("size=%d\n",sizeof(Test));
这个相信你们都能猜获得。答案是4.这个不解释。spa
值得一提的是,设计
Test t; printf("%d,%d",&t,&(t.a));
t,和t.a的地址是同样的指针
2.加上成员函数 code
class Test { public: int a ; int tt(){return 0;} };
这个可能有些难度 。有人猜是4,有人猜是8,或者其它。对象
这个仍然是4,缘由是成员函数并不属于类(或者说对象),全部的成员函数和全局函数等,都在代码段。因此在调用成员函数时,会隐式的传个this过去,这个this做用其实就是将对象内全部成员变量传递进去。blog
关于这一点,读过《Lua程序设计》的“面向对象”一章的同窗,可能会有更深入的体会。
3.static
class Test { public: int a ; static int b ; int tt(){return 0;} };
结果仍然是4,static 变量不占用内存??
不是的,static 变量存放在静态区,并不和普通成员变量在一个区域,因此仍然是4.
4.增长virtual
class Test { public: int a ; virtual int tt(){return 0;} };
增长一个virtual ,会增长一个虚函数表指针(即便有多个虚函数,也仅有一个虚函数表)
一个有趣的问题是,一个指针占用多少个字节,是4 个字节 吗?
不是的,其实和机器字长有关,在32位机器上是4字节,若是在64位机器上,则是8个字节 。
因此在个人编译环境下,这个的答案应该是12
5.继承的状况
继承的状况下,子类的字节数就是父类加子类.
但须要注意的一点是,子类只有一份虚函数表指针,指向的表中是父类虚函数加子类虚函数