首页 理论教育 C++类的大小简介-零基础C++从入门到精通

C++类的大小简介-零基础C++从入门到精通

时间:2023-08-20 理论教育 版权反馈
【摘要】:动手写8.10.1动手写8.10.1展示了自定义类型的大小。运行结果如图8.10.1所示:图8.10.1类的大小我们可以看到,在创建的类的对象中,真正占据栈的空间的只有2个成员变量,分别为4个字节。动手写8.10.2动手写8.10.2展示了没有数据的空类的大小。运行结果如图8.10.2所示:图8.10.2空类的大小这个结果可能有些令人意外,但是仔细想想也是合理的。运行结果如图8.10.3所示:图8.10.3填充当我们尝试在类中以不同顺序排列变量的时候,会发现类的大小其实都是不尽相同的。

C++类的大小简介-零基础C++从入门到精通

在第3章中我们讲解过sizeof的用法,并用它获得了许多基本数据类型的大小。在学习了类的基本知识以后,我们也可以来了解一下自定义类型的大小,从而了解C++中类在内存中的存储细节。

动手写8.10.1

动手写8.10.1展示了自定义类型的大小。运行结果如图8.10.1所示:

图8.10.1 类的大小

我们可以看到,在创建的类的对象中,真正占据栈的空间的只有2个成员变量,分别为4个字节。静态成员变量实际上与全局变量一起存在于全局数据区,而成员函数则与其他函数一样存在于代码区。

动手写8.10.2

动手写8.10.2展示了没有数据的空类的大小。运行结果如图8.10.2所示:(www.xing528.com)

图8.10.2 空类的大小

这个结果可能有些令人意外,但是仔细想想也是合理的。在使用类的指针的时候(包括this),每个对象都需要独立地址,如果类的大小为0,那么排在一起的几个空类的地址都是一样的,我们又怎么知道它们各自是谁呢?

除此之外,我们知道有些数据类型的大小要小于4个字节,而计算机的系统都是按一定大小传输数据的,32位系统是4字节,而64位系统是8字节。如果对象在32位系统内存中的地址不是4的倍数,那本来拿一次的数据可能需要分两次来拿,这样会影响程序的效率,所以类或结构体在这种情况下会自动填充(Padding),使得其大小成为4的倍数。下面让我们来看一看Visual Studio的实际行为:

动手写8.10.3

动手写8.10.3展示了类或结构体的自动填充。运行结果如图8.10.3所示:

图8.10.3 填充

当我们尝试在类中以不同顺序排列变量的时候,会发现类的大小其实都是不尽相同的。第一种情况,MyStruct1中的两个布尔连在一起,如果后面没有变量,编译器会自动填充2个字节;而现在后面还有一个整型i1,整型跨越了两个4字节,在读取整型的时候需要取两个4字节(2字节称为字,即word;4字节称为双字,即Dword),因此编译器在这种情况下也会在i1填充2个字节,从而使i1在下一个字开始。第二种情况,MyStruct2中由于两个布尔类型被整型i1隔开,我们需要进行两次填充,第一次填3个字节让i1在下一个字开始,而第二次则是填3个字节让结构体在第三个字的结尾结束。第三种情况,MyStruct3中由于short只有2个字节,因此只需要填充1个字节让MyStruct3的大小等于4字节。

免责声明:以上内容源自网络,版权归原作者所有,如有侵犯您的原创版权请告知,我们将尽快删除相关内容。

我要反馈