C++中空类占一字节原因详解
来源:互联网 发布:大数据信息安全案例 编辑:程序博客网 时间:2024/05/22 06:42
C++中空类占位问题
在C++中空类会占一个字节,这是为了让对象的实例能够相互区别。具体来说,空类同样可以被实例化,并且每个实例在内存中都有独一无二的地址,因此,编译器会给空类隐含加上一个字节,这样空类实例化之后就会拥有独一无二的内存地址。如果没有这一个字节的占位,那么空类就无所谓实例化了,因为实例化的过程就是在内存中分配一块地址。
注意:当该空白类作为基类时,该类的大小就优化为0了,这就是所谓的空白基类最优化。
#include<iostream>using namespace std;class test{};int main(){test a, b;cout << "sizeof(test): " << sizeof(test) << endl;cout << "addr of a: " << &a << endl;cout << "addr of b: " << &b << endl;system("pause");return 0;}
如上图所示,这个占位字节仅仅是用来占位。
空白基类最优化:
#include<iostream>using namespace std;class test{};class derive :public test{private:int a;};int main(){test a, b;cout << "sizeof(test): " << sizeof(test) << endl;cout << "sizeof(derive): " << sizeof(derive) << endl;cout << "addr of a: " << &a << endl;cout << "addr of b: " << &b << endl;system("pause");return 0;}
在上例中,大部分编译器对于sizeof(derive)的结果是4,而不是8。这就是所谓的空白基类最优化在(empty base optimization-EBO 或 empty base classopimization-EBCO)。在空基类被继承后由于没有任何数据成员,所以子类优化掉基类所占的1 byte。EBO并不是c++标准所规定必须的,但是大部分编译器都会这么做。由于空基类优化技术节省了对象不必要的空间,提高了运行效率,因此成为某些强大技术的基石,基于类型定义类如stl中的binary_function、unary_function、iterator、iterator_traits的实现复用;基于策略类如内存管理、多线程安全同步的实现复用。当某个类存在空类类型的数据成员时,也可考虑借助EBO优化对象布局.
注意:空白基类最优化无法被施加于多重继承上只适合单一继承。
多继承:
#include<iostream>using namespace std;class test1{};class test2{};class derive1 :public test1{private:int a;};class derive2 :public test1,public test2{private:int b;};int main(){cout << "sizeof(test): " << sizeof(test1) << endl;cout << "sizeof(derive): " << sizeof(derive1) << endl;cout << "sizeof(derive): " << sizeof(derive2) << endl;system("pause");return 0;}
0 0
- C++中空类占一字节原因详解
- C字节对齐详解
- C/C++字节详解
- C语言中空字符,空格
- C语言字节对齐详解
- C语言字节对齐详解
- C语言字节对齐详解
- C语言字节对齐详解
- C语言字节对齐详解
- C语言字节对齐详解
- C/C++字节对齐详解
- C/C++字节对齐详解
- C语言字节对齐详解
- C语言字节对齐详解
- C语言字节对齐详解
- C语言字节对齐详解
- C语言字节对齐详解
- C语言字节对齐详解
- 自定义View多层圆实现
- 使用openvswitch实现跨主机docker容器互联
- Android 简史
- 记事本(c#实现,包含,打开,保存,另存为,复制,粘贴等功能)
- Centos6.7 Centos7.0 安装OpenVSwitch痛苦经历
- C++中空类占一字节原因详解
- Huffman 统计词频(C#)
- Java实现MD5加密(二)
- OS进程调度 HIT
- CodeForces
- HDU 5236 Article(概率DP+贪心 待解决)
- windows下redis 开机自启动
- CentOS7安装Openvswitch 2.3.1 LTS
- Servlet3.1下@MultipartConfig注解方式上传文件