结构体内存对齐的规则及例题详解

1.第一个成员直接对齐到相对于结构体变量起始位置为0的偏移处
2.从第二个成员开始,要对齐到该成员 大小(对齐数) 的整数倍的偏移处
3.结构体的大小为其 最大成员大小(最大对齐数) 的整数倍
4.如果一个结构体中存在嵌套结构体,则嵌套结构体对齐到自己的最大对齐数的整数倍
    如一个嵌套结构体大小为16字节,其最大对齐数为8,则对齐到8的倍数,往下占16个字节
#pragma pack(n)  设置默认对齐数,设置的是全局的整个结构体的对齐数和其参数的对齐数

例题:

struct A
{
 int a;
 short b;
 int c;
 char d;
};

a占四个字节,从0开始,对齐到0,1,2,3

b占两个,从2的倍数4开始,对齐到4,5

c占四个,从4的倍数8开始,对齐到8,9,10,11

d占一个,从1的倍数12开始,对齐到12

此时总共占了13个字节,而结构体的大小为其 最大成员大小(最大对齐数) 的整数倍

最大对齐数为4,则结构体的大小为4的倍数16

若该结构体为嵌套结构体,即该结构体中存在结构体,则子结构体对齐到其最大对齐数的整数倍

struct A
{
 int a;
 short b;
 struct B s1;
 int c;
 char d;
};
struct B
{
 int a;
 short b;
 char c;
 double d;
};

对B:

a占四个字节,从0开始,对齐到0,1,2,3

b占两个,从2的倍数4开始,对齐到4,5

c占一个,从1的倍数6开始,对齐到6

d占八个,从8的倍数8开始,对齐到8,9,10,11,12,13,14,15

sizeof(B)=16

对A:

a占四个字节,从0开始,对齐到0,1,2,3

b占两个,从2的倍数4开始,对齐到4,5

s1占十六个字节,其最大对齐数为,8,从8的倍数8开始,对齐到8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23

c占四个,对齐到4的倍数20开始,对齐到24,25,26,27

d占一个,对齐到28

此时A占了29个字节,其最大对齐数为8(子结构体的最大对齐数 与 自己的其他成员的最大对齐数中最大的那个),则结构体大小为8的倍数32

#pragma pack(n)设置的是整个结构体的对齐数和其参数的对齐数,当整个结构体的对齐数或其参数的对齐数 大于 n时,把对齐数改为n,比如int的对齐数是4,那它就要对齐到4的倍数,如果设置对齐数为2那它只用对齐到2的倍数

#pragma pack(2)
struct A
{
	int a;
	short b;
	int c;
	char d;
};

现在设置对齐数为2

a对齐到0,1,2,3

b对齐到4,5

此时由于4>2,所以c从2的倍数6开始,对齐到6,7,8,9

d对齐到10

结构体的大小为2的整数倍=12

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值