Data语意学01

本文探讨了C++中对象模型的内存布局,特别是nonstaticDataMember和staticDataMember的区别,通过实例TestSize0、TestSize1、TestSize2和TestSize3展示类的大小计算。重点讲解了空类、虚继承、public继承对内存占用的影响。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

C++对象模型,尽量以空间优化和存取速度的优化来表现nonstatic Data Member,他把数据直接存放在一个class中,对于继承来的也是如此。

对于static Data Member, 则被放置在一个程序的global data segment中,不影响class的大小,无论创造了多少个该类的对象,这个static Data Member只有一个,即使对象不存在,这个数据也存在

1.先来看四个类

class TestSize0
{

};


class TestSize1 : public virtual TestSize0
{

};


class TestSize2 : public virtual TestSize0
{

};


class TestSize3 : public  TestSize1, public TestSize0
{

};

2.那么大家认为这四个类的大小分别是多少呢

     cout << sizeof(TestSize0) << endl;

     cout << sizeof(TestSize1) << endl;

     cout << sizeof(TestSize2) << endl;

     cout << sizeof(TestSize3) << endl;

在这里插入图片描述

3.为什么第一个类size0里面什么都没有,为什么大小是1呢?

空类有一个隐藏的Byte,那是被编译器安插进去的一个char,使得这一个class的两个objects得以在内存中配置独一无二的地址

4.size1和size2虚继承了size0,那么他们内部就会有一个虚基类指针,指向一个虚基类表

在32位环境下,就是4个字节

5.size3 是public继承了 size2 和 size1, 所以是八个字节

6.一个虚基类只会在其派生类中存在一份实例,不论他在class的继承体系中被继承了多少次

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值