struct(class)和union内存对齐

数据类型

基本数据类型所占空间(unsigned无符号类型相同):

  • char:1字节
  • short:2字节
  • int (long):4字节
  • double (long long):8字节

 

联合体union内存对齐:

  1. 大小足够容纳最宽的成员;
  2. 大小能被其包含的所有基本数据类型的大小所整除。(是被数据类型的大小:1,2,4,8,不是变量大小 )

方法:

  1. 内存大小只取决于最大的成员
  2. 找到占空间最大的成员,取最大的空间值X
  3. 当X无法被所有的数据类型大小所整除,就补加A,使得X+A可以被所有的数据类型大小所整除
  4. 则X+A为union的大小

例1:

union union1
{
    char    a;	//类型大小1字节,变量大小1字节
    short   b;  //类型大小2字节,变量大小2字节
    int     c;  //类型大小4字节,变量大小4字节
    double  d;  //类型大小8字节,变量大小8字节
};  

union1取最大的变量,和其他变量无关
a-----------1
b-----------2
c-----------4
d-----------8

最大的是double=8,

8 mod 1=0

8 mod 2=0

8 mod 4=0

8 mod 8=0

所以union1的内存大小为8

例2

union union2
{
	char a[13];    //类型大小1字节,变量大小3字节
	short b;      //类型大小2字节,变量大小2字节
	int c[2];     //类型大小4字节,变量大小8字节
};

union2取最大的变量,和其他变量无关
a-----------13
b-----------2
c-----------8

最大的是a   13

13补3=16

16 mod 1=0

16 mod 2=0

16 mod 4=0

16 mod 8=0

所以union2的内存大小为16

 

结构体struct内存对齐:

  1. 结构体在内存中存放是按单元存放的,
  2. 所开辟单元的最大长度取决于占字节最大的数据类型,
  3. 存储顺序对空间的使用率有一定的影响。

方法

  1. 先找最大的是数据类型大小X
  2. 在最大的变量之前,只要不超过最大变量的长度,就堆在一起成一行
  3. 每一行不是X的倍数,就补齐到最近的X的倍数
  4. 之后加和为总的大小

例1

struct tagPhone1
{
	char   A;
	int    B;
	short  C;
};

tagPhone1 内存状态

A            类型大小1字节,变量大小1字节

BBBB     类型大小4字节,变量大小4字节

CC          类型大小2字节,变量大小3字节

只用看最大的类型:int

则最小单位为4字节,每次开辟新的单元必须是4字节的整数倍

开辟了三行

内存大小为 3*4 = 12

所以tagPhone1 的大小为12

例2

struct tagPhone2
{
	char   A;
	short  C;
	int    B;

};

tagPhone2 内存状态

ACC           类型大小1字节,变量大小1字节

BBBB     类型大小4字节,变量大小4字节

只用看最大的类型:int

则最小单位为4字节,每次开辟新的单元必须是4字节的整数倍

开辟了2行

内存大小为 2*4 = 8

所以tagPhone2的大小为8

例3

struct tagPhone3
{
     	char   A;
	char   B[2];
     	char   C[4];
};

tagPhone3 内存状态

ABBCCCC 

只用看最大的类型:char

所以tagPhone3的大小为1+2+4=7

例4

struct tagPhone4
{
	int a;
	double b;
	char c[9];
};

tagPhone4 内存状态

AAAA

BBBBBBBB

CCCCCCCCC

只用看最大的类型:double

需要成为8倍数

所以(4补4=8)+8+(9补7=16)=8+8+16=32

所以tagPhone4的大小为32

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值