union和struct类型的大小计算

对齐就是要满足存储变量的起始地址与对齐大小余数为0。

对于union,分两步:先算union对齐大小,对齐的大小是取决于union成员中字节对齐最大的那个;再算union实际分配的空间,而分配给union的实际大小不仅要满足是对齐大小的整数倍,同时要满足实际大小不能小于最大成员的大小
如:
Union U1
{
Char a[9];
Int
b;
};
成员a是char数组,对齐大小为1字节,成员b是int,对齐大小为4字节,所以U1对齐大小为4字节;分配给U1的实际大小既要是4字节的整数倍,又要不小于最大成员a的大小,即位4的整数倍又要大于9,所以实际分配的空间为12字节。
若其中的int b改为double,则对齐为8,大小为16。

复杂一点的情况:
Union U2
{
U1 a;
Double b;
};
对齐是double的大小,为8,大小应当为是16。

对于stuct,分三步:先算struct的对齐大小,对齐的大小也是取决于struct成员中字节对齐最大的那个;然后根据每个成员的对齐大小对齐每个成员算出分配的空间;最后算出struct实际分配的空间,在满足对齐每个成员的基础上,满足是Struct对齐大小的整数倍

Struct S1
{
Char a[13];
Double c;
};

对齐大小为8,对齐每个成员后大小为24,正好是8的整数倍,所以实际分配的大小就为24。

Struct S2
{
S1 a;
U1 b;
};
S1对齐大小为8,U1对齐大小为4,因此S2的对齐大小8,体积大小为大于24+12且要为8的倍数,结果为40。


这里所说的union和struct的对齐,是指其作为其他复杂对象中的元素的时候要求的对齐,对于本身大小的计算并没有关系。本身的大小只和其所包含的基本元素的对齐有关系。


struct的大小和内部元素的排列是有很大关系的,而union里元素排序没关系,因此在使用struct的时候,安排好元素的位置,可以减少结构体的大小
如:
Struct S3
{

char b;

int
c;

char d[13];
};
根据之前的原则,因为c需要4字节对齐,因此b之后会有3字节空余。所以1+3(空余)+4+13=21,要求为4的倍数,则为24。
若更改为
Struct S4
{
Char b;
Char d[13];
Int c;
}
则c之前会空余2字节,所以1+13+2+4=20,并且已经为4的倍数,所以大小就是20。


关于#pragma pack(),该标示用于重新指定对齐的大小,当元素的对齐大于指定的对齐大小的时候,成员和整个对象的对齐大小会采用相对较小的。
如:
Union U3
{
Char a[9];
Double b;
};
该union的对齐为8,大小为16(大于9且为8的倍数)。
若加上
#pragma pack(4)// pack(0)会采用默认的字节(4)
则对于U3中的基本元素b,其对齐由原来的8变为4,而a的对齐仍然是1,则U3的对齐为4,大小为12。
当然U3的对齐也由8变成了4。

  • 3
    点赞
  • 19
    收藏
    觉得还不错? 一键收藏
  • 6
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值