一个类的实例化对象所占空间的大小? 注意不要说类的大小,是类的对象的大小。
首先,类的大小是什么?确切的说,类只是一个类型定义,它是没有大小可言的。 用sizeof运算符对一个类型名操作,得到的是具有该类型实体的大小。add charles 空结构体:struct d{} 的sizeof也是1。
具体规则如下:
1:sizeof统计的是内存四区中的堆和栈里面的数据,而不包含数据区和代码区,因此并不统计static静态成员(因为static成员是存储在数据区,且static成员是属于整个类的,而不专属于某一个对象) 和 函数成员( 因为类中的函数在调用的时候,直接加载到代码段,而不会分配内存空间 ) ;
2:sizeof(A)的大小和成员的大小总和是什么关系呢,很简单,一个对象的大小大于等于所有非静态成员大小的总和。
为什么是大于等于而不是正好相等呢?超出的部分主要有以下两方面:
1) C++对象模型本身 对于具有虚函数 (不论虚函数的个数) 的类型来说,在实例化对象时,编译器会自动在对象中插入一个指向虚函数表的指针,占四个字节;而如果这个类是多继承的话,且继承的每个父类都是虚函数,则有几个父类,则会产生几张虚函数表,对应的会有几个相应的指针。
2) 编译器优化 因为对于大多数CPU来说,CPU字长的整数倍操作起来更快,因此对于这些成员加起来如果不够这个整数倍,有可能编译器会插入多余的内容凑足这个整数倍,此外,有时候相邻的成员之间也有可能因为这个目的被插入空白,这个叫做“补齐”(padding)。
3)C++标准规定类的大小不为0,空类的大小为1,当类不包含虚函数和非静态数据成员时,其对象大小也为1。 如果在类中声明了虚函数(不管是1个还是多个),那么在实例化对象时,编译器会自动在对象里安插一个指针指向虚函数表VTable,在32位机器上,一个对象会增加4个字节来存储此指针,它是实现面向对象中多态的关键。而虚函数本身和其他成员函数一样,是不占用对象的空间的。
4)空类实例化后占据的内存大小为1字节,这是因为空类也可以实例化,而每一个实例化的对象在内存中都是独一无

本文详细介绍了C++中sizeof运算符用于计算类实例对象大小时遵循的规则,包括不考虑静态成员和函数成员,讨论了虚函数对对象大小的影响,以及编译器优化中的内存对齐填充。还提到了C++标准对空类大小的规定,并通过测试代码展示了实际占用内存的情况。

被折叠的 条评论
为什么被折叠?



