C++ 类中数据成员分布详解

本文详细探讨了C++类中数据成员的内存分布,包括空类的1字节填充、数据成员的顺序与对齐、继承时的数据布局、虚函数的影响以及多重继承和虚继承的情况。总结了不同编译器可能的处理方式,并提到了查看Visual Studio中类内存布局的方法。
摘要由CSDN通过智能技术生成

概述

我们都知道类中包含着数据成员,但是数据成员在内存中是怎样分布的呢?继承之后数据又是怎样布局的呢?下面对这些问题进行整理解答。首先说明的是类的空间分布是编译器编译的结果,不同的编译器有可能会不一样,但是原理是一样的。

1、空类

我们定义了一个空类,然后对空类进行sizeof计算,如下:

class myclass
{
};
cout  << sizeof myclass << endl;	//打印出1

按照正常的逻辑,这里应该为0啊,为什么会为1呢?

因为编译器在我们背后搞鬼,在我们定义空类后,编译器会安插一个char到类中。这样这个类定义出来的两个对象在内存中就是独一无二的。

2、数据成员的分布

C++标准要求,在同一个防控属性(private、protect、public)中,非静态数据变量在对象中的排列顺序和声明顺序一样。静态成员变量会存放在数据模块中,不会放在对象布局中,和类对象无关。

对象的成员变量初始化的顺序是由声明顺序决定就是这样来的。

数据与数据之后并不一定是连续空间,因为有 边界调整(对齐补齐)的原因会填补一些字节。如

class myclass
{
	char	m_char;		//占1个字节
	int		m_iNum
  • 8
    点赞
  • 20
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值