类的大小

转载 2016年08月28日 21:07:40

http://blog.chinaunix.net/uid-26722078-id-3756839.html

#include

class a {};
class b{};
class c:public a{
 virtual void fun()=0;
};
class d:public b,public c{};
int main()
{
 cout<<"sizeof(a)"<<sizeof(a)<<endl;
  cout<<"sizeof(b)"<<sizeof(b)<<endl;
  cout<<"sizeof(c)"<<sizeof(c)<<endl;
  cout<<"sizeof(d)"<<sizeof(d)<<endl;
  return  0;}

程序执行的输出结果为:

sizeof(a) =1

sizeof(b)=1

sizeof(c)=4

sizeof(d)=8

为什么会出现这种结果呢?初学者肯定会很烦恼是吗?类a,b明明是空类,它的大小应该为为0,为什么 编译器输出的结果为1呢?这就是我们刚才所说的实例化的原因(空类同样可以被实例化),每个实例在内存中都有一个独一无二的地址,为了达到这个目的,编译器往往会给一个空类隐含的加一个字节,这样空类在实例化后在内存得到了独一无二的地址.所以a,b的大小为1.

而类c是由类a派生而来,它里面有一个纯虚函数,由于有虚函数的原因,有一个指向虚函数的指针(vptr),在32位的系统分配给指针的大小为4个字节,所以最后得到c类的大小为4.

类d的大小更让初学者疑惑吧,类d是由类b,c派生迩来的,它的大小应该为二者之和5,为什么却是8  呢?这是因为为了提高实例在内存中的存取效率.类的大小往往被调整到系统的整数倍.并采取就近的法则,里哪个最近的倍数,就是该类的大小,所以类d的大小为8个字节.

当然在不同的编译器上得到的结果可能不同,但是这个实验告诉我们初学者,不管类是否为空类,均可被实例化(空类也可被实例化),每个被实例都有一个独一无二的地址.

我所用的编译器为vc++ 6.0.

下面我们再看一个例子.

#include
class a{
pivate: 
int data;
};

class b{ 
private:
     int data;
  static int data1;
};
 int b::data1=0;
 void mian(){
 cout<<"sizeof(a)="<<sizeof(a)<<endl;
  cout<<"sizeof(b)="<<sizeof(b)<<endl;
 }

执行结果为:

sizeof(a)=4;

sizeof(b)=4;

为什么类b多了一个数据成员,却大小和类a的大小相同呢?因为:类b的静态数据成员被编译器放在程序的一个global  data members中,它是类的一个数据成员.但是它不影响类的大小,不管这个类实际产生 了多少实例,还是派生了多少新的类,静态成员数据在类中永远只有一个实体存在,而类的非静态数据成员只有被实例化的时候,他们才存在.但是类的静态数据成员一旦被声明,无论类是否被实例化,它都已存在.可以这么说,类的静态数据成员是一种特殊的全局变量.

所以a,b的大小相同.

下面我们看一个有构造函数,和析构函数的类的大小,它又是多大呢?

#include
class A{
public :
 A(int a){
  a=x;}
 void f(int x){
  cout<<x<<endl;}
  ~A(){}

private:
   int x;
   int g;
   };
class B{
public:
 private:
 int  data; int data2;
 static int xs;
};
int B::xs=0;
void  main(){
 A s(10);
 s.f(10);
 cout<<"sozeof(a)"<<sizeof(a)<<endl;
  cout<<"sizeof(b)"<<sizeof(b)<<endl;
 }程序执行输出结果为:

10 ,

sizeof(a) 8

sizeof(b) 8

它们的结果均相同,可以看出类的大小与它当中的构造函数,析构函数,以及其他的成员函数无关,只与它当中的成员数据有关.

从以上的几个例子不难发现类的大小:

1.为类的非静态成员数据的类型大小之和.

2.有编译器额外加入的成员变量的大小,用来支持语言的某些特性(如:指向虚函数的指针).

3.为了优化存取效率,进行的边缘调整.

4 与类中的构造函数,析构函数以及其他的成员函数无关

c++类的大小计算

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

c++ 类大小(含虚函数)

虽然很难找到一本不讨论多态性的C++书籍或杂志,但是,大多数这类讨论使多态性和C++虚函数的使用看起来很难。我打算在这篇文章中通过从几个方面和结合一些例子使读者理解在C++中的虚函数实现技术。说明一点...
  • FrankieWang008
  • FrankieWang008
  • 2011年12月20日 13:06
  • 2843

【Java】java中类的大小

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

C++类对象大小的计算(二)含有虚函数类大小计算

以下内存测试环境为Win7+VS2012
  • gongtxy
  • gongtxy
  • 2014年10月01日 15:54
  • 1050

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

先看这么个问题——已知:class CBase{    int  a;    char *p;};那么运行cout这个应该很简单,两个成员变量所占的大小有嘛——8。可由时候人就是爱犯这个错误:这么简单...
  • lishengwei
  • lishengwei
  • 2008年05月08日 14:54
  • 12381

C++ 类 非虚成员函数,不影响类的大小

C++ 类 非虚成员函数,不影响类的大小,他是由编译器在编译的时候直接调用该成员函数。跟普通函数几乎没什么区别。  类要访问一个成员函数, 其实是不需要一个类对象实体的,一个类对象的空指针就可以...
  • leer168
  • leer168
  • 2011年09月29日 10:06
  • 1861

关于空类,含有虚函数的类的大小

1、为何空类的大小不是0呢? 为了确保两个不同对象的地址不同,必须如此。 类的实例化是在内存中分配一块地址,每个实例在内存中都有独一无二的二地址。同样,空类也会实例化,所以编译器会给空类隐含的添加...
  • dahai_881222
  • dahai_881222
  • 2012年08月12日 11:04
  • 1877

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
  • 2919

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

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

C++回顾之static成员、static成员函数及类对象大小计算

static静态数据成员,static静态成员函数,static静态常量数据成员,类大小的计算原则等...
  • ab198604
  • ab198604
  • 2014年02月08日 10:14
  • 2652
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:类的大小
举报原因:
原因补充:

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