sizeof 类

来源:互联网 发布:淘宝的账户管理在哪里 编辑:程序博客网 时间:2024/05/21 09:51

1、空类的sizeof是1。空类是指没有成员的类,类中的函数不占空间,除非是虚函数。

如: class A

        {

             public:

                      A(){}

                     ~A(){}

                     void fun(){}

         };

sizeof(A)是1.

注: class A1

        {

             public:

                      A1(){}

                     ~A1(){}

                     void fun(){}

                       char a[0];

         };

sizeof(A1)也是1.(VC6.0下编译)

2、若类中包含成员,则类对象的大小只包括其中非静态成员经过对齐所占的空间,对齐方式和结构体相同。如:

class A
{
public:
  int b;
  float c;
  char d;
};

sizeof(A)是12.

class A
{
public:
  static int a;
  int b;
  float c;
  char d;
};
sizeof(A)是12.

class A
{
public:
  static int a;
  int b;
  float c;
  char d;
  int add(int x,int y)
  {
    return x+y;
  }
};
sizeof(A)也是12.

 

3、若类中包含虚函数,则无论有几个虚函数,sizeof类都等于sizeof(数据成员)的和+sizeof(V表指针,为4),如:

class Base
{
      public:
             Base(){cout<<"Base-ctor"<<endl;}
             ~Base(){cout<<"Base-dtor"<<endl;}
             int a;
             virtual void f(int) {cout<<"Base::f(int)"<<endl;}
             virtual void f(double){cout<<"Base::f(double)"<<endl;}
};

sizeof(Base)为8.

 

4、对于子类,它的sizeof是它父类成员(无论成员是public或private),再加上它自己的成员,对齐后的sizeof,如:

class A2
{
      public:
             int a;
      private:
              char b;
};

class A3:public A2
{
      public:
             char b;
             short a;            
};

sizeof(A3)是8. 但如果A3如下:

class A3:public A2
{
      public:
             short a; 
             char b;          
};

sizeof(A3)是12.

 

5、对于子类和父类中都有虚函数的情况,子类的sizeof是它父类成员(无论成员是public或private),再加上它自己的成员,对齐后的sizeof,再加4(虚表指针)。如:

class Base
{
      public:
             Base(){cout<<"Base-ctor"<<endl;}
             ~Base(){cout<<"Base-dtor"<<endl;}
             int a;
             virtual void f(int) {cout<<"Base::f(int)"<<endl;}
             virtual void f(double){cout<<"Base::f(double)"<<endl;}
};

class Derived:public Base
{
  public:
         Derived(){cout<<"Derived-ctor"<<endl;}
         int b;
         virtual void g(int){cout<<"Derived::g(int)"<<endl;}
};

sizeof(Derived)是12.

 

6、对于虚继承的子类,其sizeof的值是其父类成员,加上它自己的成员,以及它自己一个指向父类的指针(大小为4),对齐后的sizeof。如:

#include   <iostream.h>  
   
  class   a  
  {  
  private:  
  int   x;  
  };  
   
   
   
  class   b:   virtual   public   a  
  {  
  private:  
  int   y;  
  };  
   
  class   c:   virtual   public   a  
  {  
  private:  
  int   z;  
  };  
   
  class   d:public   b,public   c  
  {  
  private:  
  int   m;  
  };  
  int   main(int   argc,   char*   argv[])  
  {  
  cout<<sizeof(a)<<endl;  
  cout<<sizeof(b)<<endl;  
  cout<<sizeof(c)<<endl;  
  cout<<sizeof(d)<<endl;  
  return   0;  
  }   
    在VC6.0下调试结果为  
  4  
  12  
  12  
  24

sizeof(b)和sizeof(c)相同,都是4+4+4=12。

sizeof(d)是sizeof(b)(为12)+sizeof(c)(为12)-b和c相同的部分(a的成员,大小是4)+d自己的成员(大小为4)=24

7、对于既有虚继承又有虚函数的子类,其sizeof的值是其父类成员(计算虚表指针大小+4),加上它自己的成员(计算虚表指针大小+4),以及它自己一个指向父类的指针(大小为4),对齐后的sizeof

class Base
{
public:
 Base(){cout<<"Base-ctor"<<endl;}
 ~Base(){cout<<"Base-dtor"<<endl;}
 virtual void f(int) {cout<<"Base::f(int)"<<endl;}
virtual void f(double){cout<<"Base::f(double)"<<endl;}
};

class Derived:virtual public Base
{
public:
 Derived(){cout<<"Derived-ctor"<<endl;}
 virtual void g(int){cout<<"Derived::g(int)"<<endl;}
};

sizeof(Base)=4

sizeof(Derived)=12 (父类虚表指针大小4+自己虚表指针大小4+子类指向父类的一个指针大小4=12)

原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 孩子老是落题怎么办 脑子笨反应慢怎么办 脑子笨的人怎么办 孩子学习反应慢怎么办 孩子学习不入门怎么办 高三出现厌学怎么办 天生笨的人怎么办 学生考试粗心该怎么办 高三学生失眠怎么办 期末考试考差了怎么办 小孩考试太粗心怎么办 带孩子太粗心怎么办 小孩做数学粗心怎么办 小学一年级学生厌学怎么办 小学二年级厌学怎么办 做题做的烦躁了怎么办 英语不会做题怎么办 孩子审题不细心怎么办 生孩子有恐惧症怎么办 小孩不喜欢上幼儿园怎么办 小孩不喜欢去幼儿园怎么办 小孩不喜欢学生字怎么办 学生不喜欢补课老师怎么办 小孩不喜欢上学逃课怎么办 一年级小朋友不爱写字怎么办 幼儿园小朋友不爱写字怎么办 孩子懒散不积极怎么办 孩子不肯上幼儿园怎么办 孩子不肯去幼儿园怎么办 小孩记不住字怎么办 小孩不会写字要怎么办 一年级孩子不爱写字怎么办 一年级小孩不爱写字怎么办 孩子不爱写字怎么办呢 幼儿园孩子不爱写字怎么办 孩子上学没学籍怎么办 孩子上学务工证怎么办 孩子上学被欺负怎么办 孩子害怕上幼儿园怎么办 孩子写字肩膀疼怎么办 5岁不会写字怎么办