1.空类的大小:
class C2
{
};
结果:sizeof(C2) = 1
分析:这是因为当我们实例化一个类对象时,就是为其分配内存空间,并且每一个实例化的类都会有一个独一无二的内存地址,空类也不例外,必须为其分配一个内存,因此编译器给分配了一个字节的内存,使其独一无二。
2.只含有一个虚函数的类的大小:
class C1
{
public:
virtual int sum(int i1, int i2)
{
return (i1 + i2);
}
protected:
private:
// double m_dvar1;
// char m_cVar2;
};
结果:sizeof(C1) = 4
分析:虚函数指针占四个字节。
3.对齐原则. 当一个类里有个数据类型占字节数最大时, 其他数据类型大小和最大的对齐.。
情况1:class C1
{
public:
// virtual int sum(int i1, int i2)
// {
// return (i1 + i2);
// }
protected:
private:
double m_dvar1;
char m_cVar2;
};
结果:sizeof(C1) = 16
分析:m_dvar1占8个字节,m_cVar2占一个字节,但是m_cVar2要与m_dvar1保持对齐,所以 8 × 2 = 16
情况2:class C1
{
public:
// virtual int sum(int i1, int i2)
// {
// return (i1 + i2);
// }
protected:
private:
double m_dvar1;
char m_cVar2;
int m_ivar3;
};
结果:sizeof(C1) = 16
分析:m_cVar2 和m_ivar3相加没有超过8个字节,算成8个字节,与m_dvar1一共还是16个字节。
情况3:有虚函数存在时
class C1
{
public:
virtual int sum(int i1, int i2)
{
return (i1 + i2);
}
protected:
private:
double m_dvar1;
char m_cVar2;
// int m_ivar3;
};
结果:sizeof(C1) = 24
分析:如果有虚函数存在,虚函数会单独处理,不遵守对齐原则,m_cVar2补齐8字节,虚函数补齐8字节,加上m_dvar1 8+ 8+ 8 = 24
4.类中存在静态成员变量
class C1
{
public:
virtual int sum(int i1, int i2)
{
return (i1 + i2);
}
protected:
private:
// double m_dvar1;
char m_cVar2;
// int m_ivar3;
static int data1;
};
结果:sizeof(C1) = 8
分析:静态成员变量被编译器存放在global data members中,不影响类的大小,类是否被实例化,它都存在。
以后遇到其它情况再总结。