1:先看一个空类的大小:
sizeof(A)的结果为1;
sizeof(A)的结果照样为1;
首先,说类的大小本质上是说类的实例的大小,类只是一个类型定义,它是没有大小可言的,用sizeof运算符对一个类型名操作,得到的是具有该类型实体的大小;
calss A; A a; szieof(A) == sizeof(a);但是这样编译在编译器当中编译不通过。
上面为什么sizeof(A)的结果为1呢?
(1)因为一个空类也要实例化,所谓类的实例化就是在内存中分配一块地址,每个实例在内存当中都有独一无二的地址。同样空类也要被实例化,所以编译器会给空类
添加一个隐含的字节,这样空类实例化后就有了独一无二的地址了。
(2)而析构函数,跟构造函数这些成员函数,是跟sizeof无关的,也不难理解因为我们的sizeof是针对实例,而普通成员函数,是针对类体的,一个类的成员函数,多个实例也
用相同的函数指针,所以自然不能归为实例的大小。
带参数类型的大小:
sizeof(A) = 4;
带静态类型参数的大小:
sizeof(A) = 1;
类的静态数据成员被编译器放在程序的一个global data members中,它是类的一个数据成员.但是它不影响类的大小,不管这个类实际产生了多少实例,还是派生了多少新的类,静态成员数据在类中永远只有一个实体存在,而类的非静态数据成员只有被实例化的时候,他们才存在.但是类的静态数据成员一旦被声明,无论类是否被实例化,它都已存在.可以这么说,类的静态数据成员是一种特殊的全局变量.
带一个虚函数类型的大小:
sizeof(A) = 4;
带多个虚函数的大小
sizeof(A) = 4;
如果在类中声明了虚函数(不管是1个还是多个),那么在实例化对象时,编译器会自动在对象里安插一个指针指向虚函数表VTable,在32位机器上,一个对象会增加4个字节来存储此指针,它是实现面向对象中多态的关键。而虚函数本身和其他成员函数一样,是不占用对象的空间的.
再看下面一段代码:
输出 1 1 8 4;
结合这个实例 我们可以得出以下结论:
在一个类中,普通成员函数,构造函数,析构函数,所有的虚函数,以及静态成员变量都是不占用类对象的内存空间的。
一个类对象的大小 等于 VPTR(虚函数指针)+ 非静态数据成员变量 + 内存对其时候的扩展内存大小!
类的总大小也遵守类似class 4字节对齐的
继承的类的大小:
1.类的大小为类的非静态成员数据的类型大小之和,也就是说静态成员数据不作考虑。
2.普通成员函数与sizeof无关。
3.虚函数由于要维护在虚函数表,所以要占据一个指针大小,也就是4字节。
4.类的总大小也遵守类似class字节对齐的,调整规则