关于class 类大小的总结

转载 2016年05月31日 13:58:54
namespace test_class_size
    {
    class A
    {  
public:  
protected:  
private:  
};  
class B{  
public:  
protected:  
private:  
};  
class C:public A,public B{  
public:  
protected:  
private:  
};  
class D:virtual public A  
{  
public:  
protected:  
private:  
};  
 
class E:virtual public A,virtual public B{  
public:  
protected:  
private:  
};  
class F{  
public:  
   int a;  
   static int b;  
protected:  
private:  
};  
void test()
{
cout<<"sizeof(A)="<<sizeof(A)<<endl;  //1
   cout<<"sizeof(B)="<<sizeof(B)<<endl;  //1
   cout<<"sizeof(C)="<<sizeof(C)<<endl;  //1
   cout<<"sizeof(D)="<<sizeof(D)<<endl;  //8 虚继承指向虚基类的指针
   cout<<"sizeof(E)="<<sizeof(E)<<endl;  //8 共享虚继承指向虚基类的指针
   cout<<"sizeof(F)="<<sizeof(F)<<endl; //4
}
    }
    namespace test_class_size2
    {
    struct A {  
  
int a;  
 
virtual ~A(){}  
 
};  
 
struct B:virtual public A{  
 
virtual ~B(){}  
 
virtual void myfunB(){}  
 
};  
 
struct C:virtual public A{  
 
virtual ~C(){}  
 
virtual void myfunC(){}  
 
};  
 
struct D:public B,public C{  
 
virtual ~D(){}  
 
virtual void myfunD(){}  
 
};  
void test()
{
cout<<"sizeof(A)="<<sizeof(A)<<endl;  //16 int对齐到8字节+8字节的虚指针
   cout<<"sizeof(B)="<<sizeof(B)<<endl;  //24  在上面的基础上+8字节的指向虚基类的指针
   cout<<"sizeof(C)="<<sizeof(C)<<endl;  //24 //同上
   cout<<"sizeof(D)="<<sizeof(D)<<endl; //32 //一个A的副本,在上面的基础上+一个从B或C里面指向A的指针
}
    }
    namespace test_class_size3
    {
    struct A {  
  
int a;  
 
virtual ~A(){}  
 
};  
 
struct B: public A{  
 
virtual ~B(){}  
 
virtual void myfunB(){}  
 
};  
 
struct C: public A{  
 
virtual ~C(){}  
 
virtual void myfunC(){}  
 
};  
 
struct D:public B,public C{  
 
virtual ~D(){}  
 
virtual void myfunD(){}  
 
};  
void test()
{
cout<<"sizeof(A)="<<sizeof(A)<<endl;  //16
   cout<<"sizeof(B)="<<sizeof(B)<<endl;  //16
   cout<<"sizeof(C)="<<sizeof(C)<<endl;  //16
   cout<<"sizeof(D)="<<sizeof(D)<<endl; //32
}

    }


    namespace test_class_size2解释:A中int+虚表指针(16)。B,C中由于是虚继承因此大小为A+指向虚基类的指针,B,C虽然加入了自己的虚函数,但是虚表指针是和基类共享的,因此不会有自己的虚表指针。D由于B,C都是虚继承,因此D只包含一个A的副本,于是D大小就等于A+B中的指向虚基类的指针+C中的指向虚基类的指针。(16+8+8)

    namespace test_class_size3解释:A中int+虚表指针(16)D由于B,C不是虚继承,因此D包含两个A的副本,于是D大小就等于A+A的大小

C++类的大小——sizeof(class)

第一:孔磊d class CBase { }; 运行cout sizeof(CBase)=1; 为什么空的什么都没有是1呢?查资料……查啊查……OK这里了:先了解一个概念:类的实例化,所谓类的...
  • yangyangye
  • yangyangye
  • 2014年08月03日 22:06
  • 6307

C++ Class Size (C++ 类大小)

C++ Class Size (C++ 类大小)   2013-03-17 20:05:34|  分类: C++ |  标签:c++  class  size  类大小   |举报 |字号 ...
  • taiyang1987912
  • taiyang1987912
  • 2014年07月24日 09:55
  • 2918

【Java】java中类的大小

http://blog.csdn.net/aaa1117a8w5s6d/article/details/8254922 在Java中,一个空Object对象的大小是8byte,这个大小只是保存堆...
  • michellechouu
  • michellechouu
  • 2014年09月22日 16:43
  • 683

Java中 Class类总结

1 Java 中获取Class对象的方法 分类: Java Class object 诞生管道 示例 运用getClass() 注:每个class 都有此函数 S...
  • u011258318
  • u011258318
  • 2015年04月18日 22:22
  • 944

类的大小——sizeof 的研究(1)

先看一个空的类占多少空间? class Base{public: Base(); ~Base();};      注意到我这里显示声明了构造跟析构,但是sizeof(Base)的结果是1.     因...
  • hairetz
  • hairetz
  • 2009年05月12日 17:09
  • 20424

从3个程序理解C++类实例大小

程序1: #include using namespace std; class a{}; class b{}; class c:public a{ virtual void fun()=0; ...
  • xyw_Eliot
  • xyw_Eliot
  • 2014年02月20日 21:27
  • 1014

c++中类没有数据成员时,类对象的大小

class X { }; class Y : public virtual X { }; class Z : public virtual X { }; class A : ...
  • wly_2014
  • wly_2014
  • 2016年04月08日 09:50
  • 904

类大小sizeof(class)

      class如同int等内建类型一样,分配有一定大小的内存,本文通过基本类、含有虚函数的类、单继承的派生类和多重继承的派生类来考察类的内存布局规律。1、普通类对象的大小 //普通类对象的内存...
  • braveyly
  • braveyly
  • 2010年05月01日 21:52
  • 1151

c++类的大小计算

c++中类所占的大小计算并没有想象中那么简单,因为涉及到虚函数成员,静态成员,虚继承,多继承以及空类等,不同情况有对应的nisan方式,在此对各种情况进行总结。 首先要明确一个概念,平时所声明的类只是...
  • fengxinlinux
  • fengxinlinux
  • 2017年06月01日 23:01
  • 2026

C++类的大小——sizeof()

先看这么个问题——已知:class CBase{    int  a;    char *p;};那么运行cout这个应该很简单,两个成员变量所占的大小有嘛——8。可由时候人就是爱犯这个错误:这么简单...
  • lishengwei
  • lishengwei
  • 2008年05月08日 14:54
  • 12377
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:关于class 类大小的总结
举报原因:
原因补充:

(最多只允许输入30个字)