博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
c++空类为什么占用1个字符
阅读量:6692 次
发布时间:2019-06-25

本文共 823 字,大约阅读时间需要 2 分钟。

在C++中空类会占一个字节,这是为了让对象的实例能够相互区别。具体来说,空类同样可以被实例化,并且每个实例在内存中都有独一无二的地址,因此,编译器会给空类隐含加上一个字节,这样空类实例化之后就会拥有独一无二的内存地址。如果没有这一个字节的占位,那么空类就无所谓实例化了,因为实例化的过程就是在内存中分配一块地址。
   
注意:当该空白类作为基类时,该类的大小就优化为0了,这就是所谓的空白基类最优化。
class T{};int main(){    T t1, t2;    cout<
<

运行结果:

如上图所示,这个占位字节仅仅是用来占位。
 
 
空白基类最优化:
class T{};class TT :public T{  int a;};int main(){    T t1;    TT tt1;    cout<
<

运行结果:

    在上例中,大部分编译器对于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优化对象布局.

转载于:https://www.cnblogs.com/phpandmysql/p/10835690.html

你可能感兴趣的文章
从此不再惧怕URI编码:JavaScript及C# URI编码详解
查看>>
[OpenGL] glVertexAttribPointer函数与glVertexAttribIPointer函数使用中遇到的小坑(int类型被自动转换为float类型)...
查看>>
oracle添加控制文件,ORA-00214: 错误
查看>>
SQL 语句技巧--单列数据变多行数据
查看>>
面试问题总结
查看>>
HTML特殊转义字符列表
查看>>
2、NIO--缓冲区(Buffer)
查看>>
3、集合--AbstractCollection、AbstractList源码
查看>>
如何较为直观的打印二叉树
查看>>
2014年计划:
查看>>
USACO习题:Broken Necklace
查看>>
打包命令
查看>>
POJ 1679 The Unique MST 【最小生成树/次小生成树模板】
查看>>
什么是动态链接库
查看>>
mysqldump 定时任务 执行后备份的文件为空
查看>>
Python-Django 模型层-单表查询
查看>>
Windows Redis默认配置文件,Redis配置不生效解决方案
查看>>
oracle-------window安装
查看>>
I/O完成端口、异步I/O、APC和线程池(四)——线程池
查看>>
获取Java程序运行的路径 | 获取当前jar包的路径
查看>>