空类的大小是多少?原因是什么?

首先,我们要知道,一个类是没有大小的,应该说成是类的实例的大小。

class A;
A a;

其中,sizeof(A) == sizeof(a);
一个对象的大小 大于等于所有的非静态成员大小的总和。
这是为什么呢?

1.指向虚函数表的指针

对于有虚函数的类,需要有一个方法为它的实体提供类型信息和虚函数入口,一般的方法是建立一个虚表(虚函数表)。在实例化时,在对象中增加一个指向虚函数的指针,许多编译器都是这样规定的

2. 内存对齐

编译器优化,因为对于大多数CPU来说,CPU字长的整数倍操作起来更快,因此对于这些成员加起来如果不够这个整数倍,有可能编译器会插入多余的内容凑足这个整数倍,此外,有时候相邻的成员之间也有可能因为这个目的被插入空白,这个叫做内存对齐。

sizeof类得到的结果等于各非静态数据成员(不包括成员函数)的总和加上编译器额外增加的字节。后者依赖于不同的编译器实现,C++标准对此不做任何保证。

一个类中成员函数、虚函数、静态数据成员都是不占用类的存储空间的。

空类大小是1不是0的原因?

因为空类也进行了实例化,每个实例在内存中都有一个独一无二的地址,为了达到这个目的,编译器一般会给一个空类隐含的加一个字节,这样就可以达到空类在实例化后得到了独一无二的地址的目的。

类的大小与什么有关,与什么无关?

  • 类的大小是非静态成员数据的类型大小之和;
  • 为了优化存取效率,进行字节对齐;
  • 由编译器额外加入的成员变量的大小,用来支持语言的某些特性;
  • 与类中的构造函数、析构函数、拷贝构造函数、赋值运算符重载、取地址运算、const取地址运算无关。

猜你喜欢

转载自blog.csdn.net/zwe7616175/article/details/81084964