32位机器上,有三个类A B C定义如下, 请确定sizeof(A) sizeof(B) sizeof(C)的大小顺序.
| struct A{ A() {} ~A() {} int m1; int m2; }; struct B:A{ B() {} ~B() {} int m1; char m2; static char m3; }; struct C{ C() {} virtual~C() {} int m1; short m2; }; |
首先是A,普通成员函数以及构造函数析构函数不归入统计范围,两个int是8个字节,因此A是8个字节,对于B,由于他继承自A,有8个字节,一个int一个char分别是4个和1个字节,static静态成员不予考虑,B一共有8+5=13个字节
对于C,由于虚函数需要维持虚函数表,需要一个指针,32位机器为4个字节,一个Int一个short为6个字节,一共为10个字节
所以应该是A<C<B
Examples:
//空类:
class CBase
{ };
空类也会被实例化,编译器会给空类隐含的添加一个字节,sizeof()的结果是1。
//这个也是空类
class Base
{
public:
Base();
~Base();
}; //1字节
class CBase
{
public:
CBase(void); //其他成员函数不归入sizeof统计
virtual ~CBase(void); //虚析构函数 virtual ~Base() 的指针占4子字节
private:
int a; //32位机器上,32 / 8 = 4 字节
char *p; // 同上 4字节
};//一共 4 + 4 + 4 = 12 字节
class Derive:public Base //Derive类首先要具有Base类的部分,也就是占12字节
{
public:
Derive():Base(){};
~Derive(){};
private:
static int st; //非实例独占 , static int st;不归入sizeof统计
int d; //占4字节
char *p; //4字节指针
}; //12 + 8 = 20 字节
另外需要注意Short是2个字节