C++空类及没有成员变量的类的大小实例分析
2023-06-13 09:15:37 时间
众所周知的C++中空类的大小为1,但是除了空类之外的其他一些没有成员变量的类的大小,还是有相当一部分开发人员对此有很多不明之处的。
这里我们以如下代码为例:
#include usingnamespacestd; classa{}; classb{}; classc:publica{ virtualvoidfun()=0; }; classd:publicb,publicc{}; intmain() { 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(); return0; }
程序执行的输出结果为:
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语言createthread函数,C++中CreateThread函数创建线程的用法和实例
- C++的pair_pair的复数是什么
- 【C++ 程序设计入门基础】- Chapter One
- c++的链表-链表入门(C++)
- C/C++ 编写并提取简易 ShellCode
- c++标准模板库
- Pytorch轻松学-RetinaNet模型导出与C++部署
- 【C++】仿函数 -- priority_queue
- 【C++】AVL树和红黑树的插入
- [C++]类与对象下篇
- C++经典面试题(最全,面中率最高)详解编程语言
- C++ STL array容器和普通数组的比较
- C++多继承同名隐藏实例详细介绍
- C++初始化列表学习
- C++中栈结构建立与操作详细解析
- C/C++产生指定范围和不定范围随机数的实例代码
- C++之CNoTrackObject类和newdelete操作符的重载实例
- C++递归删除一个目录实例
- C++进程共享数据封装成类实例
- 采用C++实现区间图着色问题(贪心算法)实例详解
- C++结构体用法实例分析
- C++实现inlinehook的原理及应用实例
- C++实现广度优先搜索实例