C++类的大小的计算

C++所占内存大小计算 C++所占内存大小计算 转载时请注明出处和作者联系方式 文章出处:http://blog.csdn.net/chenchong08 作者联系方式:vision_chen@yeah.net 说明:笔者的操作系统是32位的。 class A {}; sizeof( A ) = ? sizeof( A ) = 1 明明是空,为什么编译器说它是1呢? 空同样可以实例化,每个实例在 阅读详情

 

C++的类的大小现在经常出现在笔试题目当中。

那我们先看看一个例子:

 

程序的输出结果:

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.

下面我们再看一个例子.

 

执行结果为:

sizeof(a)=4;

sizeof(b)=4;

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

所以a,b的大小相同.

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

 

程序执行输出结果为:

10 ,

sizeof(a) 8

sizeof(b) 8

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

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

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

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

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

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

 

C++篇--大小计算、this指针 this指针还是很重要的,需要掌握的一个知识点 阅读详情

相关推荐

大小计算

大小

Scarlett的博客 2164

C++大小计算方法总结

C++的成员函数,静态成员是不占大小的。 大小等于基大小+子个non-static成员变量的大小再+非虚基大小, 如果有多态性还要考虑vptr(可能不止一个)大小,这里成员变量是会被字节对齐的。 空大小为1字节 字节对齐的问题 成员变量需要整齐的存储,所以若是有不同型的变量(本身占用字节数不同),则所有变量的大小会按照最大的的大小进行补齐,比如说,若是一个中有个bool型和int型,则bool型也会占用4个字节。若最大的为short,则bool型或...

qq_14901125的博客 1395

大小计算

C++语言中的继承是C++重要特性之一,暂且将的继承分为成员变量以及成员函数两个方面。我们知道标准C++选择的方式是每个对象存储一份自己的成员变量,那么这份成员变量的存储区是怎么布局的呢?下面分几种情况记录一些自己看法和体会(部分参考《Inside The C++ Object Model》)。   1,非静态成员变量的单一继承且不含virtual函数   C++标准

HZC的专栏 1062

c++大小计算

c++所占的大小计算并没有想象中那么简单,因为涉及到虚函数成员,静态成员,虚继承,多继承以及空等,不同情况有对应的nisan方式,在此对各种情况进行总结。 首先要明确一个概念,平时所声明的只是一种型定义,它本身是没有大小可言的。 我们这里指的大小,其实指的是的对象所占的大小。因此,如果用sizeof运算符对一个型名操作,得到的是具有该型实体的大小。关于/对象大小计算 首先,

rotation博客 3万+

c++ 大小计算

前言 一个空大小是多少? 0个字节还是一个字节?本节分析一个大小是多少, 怎么计算。 本节没有涉及中有静态成员的情况, 后面会单独对静态成员做一个分析, 现在只要知道静态成员变量不在的内存布局中。 环境 实验环境只要能编译运行的都可以, 只有86的环境指针的大小为4字节, 64环境指针大小是8字节。 一个空大小 一个空也是有大小的, 其大小为1个字节。我们可以很简单的完成这个实验...

啦啦啦 780

C++大小计算

关于C++大小计算,这在一本书《深度探索C++对象模型》一书中有非常详细的介绍,我这里归纳整理: 本节讨论的是64位地址计算机,指针长度8字节 1、大小取决于以下成员: a)非静态成员变量; b) 虚函数table c) 数据对齐 d) 空 当然还要考虑单一继承,多继承以及虚拟继承(共享继承)。 因为有博主已经写了非常详细的:入口 我这里只对博主收尾的虚继承进行进一步讲解: class A { int a; virtual void myfunA(){}//博主原文漏加了这个 }

weixin_43360707的博客 614

C++大小计算

对于s1,a在起始地址为0的位置,b在起始地址为4的位置,4是char大小的整数倍,c在起始地址为5的位置,5是char大小的整数倍,所有变量最终占用了6个内存空间,但结构体整体大小是最大对齐数的整数倍,所以s1的大小为8。但对于s2,b在起始地址为0的位置,紧接着的地址为1,但1不是int大小的整数倍,所以a在起始地址为4的位置,c就在起始地址为8的位置,此时结构体占用了9个内存空间,所以结构体大小为12。以上两个中的成员变量是相同的,并且通过结构体大小计算得出成员变量总大小为8。

m0_52319639的博客 396

C++大小计算

1 初识 测试环境: 操作系统:Windows 10 编译器:g++.exe (x86_64-posix-sjlj-rev0, Built by MinGW-W64 project) 8.1.0 本机环境测试时,指针大小为 8 字节,请读者根据实际情况自行判断。 1.1 内存对齐 可以使用 sizeof 或者 alignof 判断基本型的对齐大小。但面对自定义型的时候,前者就不行了,而后者...

zzy0006的博客 571

c++大小计算——面试也经常考

c++所占的大小计算并没有想象中那么简单,因为涉及到虚函数成员,静态成员,虚继承,多继承以及空等,不同情况有对应的计算方式,在此对各种情况进行总结。 首先要明确一个概念,平时所声明的只是一种型定义,它本身是没有大小可言的。 我们这里指的大小,其实指的是的对象所占的大小。因此,如果用sizeof运算符对一个型名操作,得到的是具有该型实体的大小。 关于/的实例对象大小计算 (...

博雅勇士的博客 575

c++ 大小计算

先给出总结: 空大小为1字节 一个中,虚函数本身、成员函数(包括静态与非静态)和静态数据成员都是不占用对象的存储空间。 对于包含虚函数的,不管有多少个虚函数,只有一个虚指针,vptr的大小。 普通继承,派生继承了所有基的函数与成员,要按照字节对齐来计算大小 虚函数继承,不管是单继承还是多继承,都是继承了基的vptr。(32位操作系统4字节,64位操作系统 8字节)! 虚继承,继承基的vptr。 1、原则1 空大小为1字节。 #include<iostream&g

LQB的梦烦了的博客 378

C++大小计算

1、首先大小计算遵循结构体的对齐原则 2、大小与普通数据成员有关,与静态成员变量和成员函数无关,包括(静态成员变量,静态成员变量函数,普通成员函数,静态常量等与大小均无关) 3、虚函数对大小有影响,这是因为虚函数表指针带来的影响 4、虚继承对大小有影响,这是由于虚基表指针的影响 4、空大小为1 对其原则: 按照结构体中长度最长的变量进行对齐,例如: class A { public: int a; char b; }; A a1; sizeof(a1); 该案例输

l15799033407的博客 486

C++大小计算

1.空大小class C2 {   }; 结果:sizeof(C2) = 1 分析:这是因为当我们实例化一个对象时,就是为其分配内存空间,并且每一个实例化的都会有一个独一无二的内存地址,空也不例外,必须为其分配一个内存,因此编译器给分配了一个字节的内存,使其独一无二。   2.只含有一个虚函数的大小class C1 { public:   virtua

辰枫的专栏 642

C++学习】c++大小计算

Nginx学习(一)

谢健的专栏 354

C++大小计算汇总

  C++涉及到虚函数成员、静态成员、虚继承、多继承、空等。   ,作为一种型定义,是没有大小可言的。   大小,指的是的对象所占的大小。因此,用sizeof对一个型名操作,得到的是具有该型实体的大小大小计算,遵循结构体的对齐原则; 大小,与普通数据成员有关,与成员函数和静态成员无关。即普通成员函数、静态成员函数、静态数据成员、静态常量数据成员,均对的...

weixin_30609287的博客 144

c++c++大小计算和this指针

每一个在内存中都会有一个共享的公共代码区来存放成员函数,中的每一个对象都共享连接这片区域,而不是将其存放在对象里,这样有利于编译器减少内存空间浪费,没有必要为每一个对像单独开辟一片空间存放成员函数。c++由成员变量和成员函数等组成,不同于c中的结构体只有成员变量,但大小计算方法和结构体的计算方法是一样的,总的来说,大小的一样是用内存对齐的方式来计算的,(事情的表象好像是我们直接在里面的函数可以对私有的成员变量进行更改,但实际这一切的实现都是this指针的功劳,

weixin_70273825的博客 280
上一篇: 2009/10/12
下一篇: 华为笔试题
tunnel115
博客等级 码龄19年 33粉丝 138原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值