手机
当前位置:查字典教程网 >编程开发 >C语言 >C++空类及没有成员变量的类的大小实例分析
C++空类及没有成员变量的类的大小实例分析
摘要:众所周知的C++中空类的大小为1,但是除了空类之外的其他一些没有成员变量的类的大小,还是有相当一部分开发人员对此有很多不明之处的。这里我们以...

众所周知的C++中空类的大小为1,但是除了空类之外的其他一些没有成员变量的类的大小,还是有相当一部分开发人员对此有很多不明之处的。

这里我们以如下代码为例:

#include using namespace std; 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; getchar(); 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呢?这是因为为了提高实例在内存中的存取效率,内存中会有数据对齐,于是类的大小往往被调整到4字节的整数倍。并采取就近的法则,往大的方向取最近的倍数,就是该类的大小,所以类d的大小为8个字节(假如d由3个空类和c派生而来,仍然是8)。

【C++空类及没有成员变量的类的大小实例分析】相关文章:

C语言函数的递归和调用实例分析

C++实现:螺旋矩阵的实例代码

C++类静态成员与类静态成员函数详解

从汇编看c++中变量类型的深入分析

基于C++内存分配、函数调用与返回值的深入分析

深入C++实现函数itoa()的分析

C++可变参数的实现方法

static全局变量与普通的全局变量的区别详细解析

C++二叉树结构的建立与基本操作

C++类中的常数据成员与静态数据成员之间的区别

精品推荐
分类导航