C++类的大小计算

来源:互联网 发布:js stringdate比较 编辑:程序博客网 时间:2024/05/13 00:49

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中,不影响类的大小,类是否被实例化,它都存在。

以后遇到其它情况再总结。