linux使结构体不对齐,结构体的内存对齐,计算结构体的大小,修改默认对齐数...

1.结构体的内存对齐规则

1. 第一个成员在与结构体变量偏移量为0的地址处。

2. 其他成员变量要对齐到某个数字(对齐数)的整数倍的地址处。

对齐数=编译器默认的一个对齐数与该成员的大小的较小值

• VS中默认值为8

• Linux中默认值为4

3. 结构体的总大小为最大对齐数(每个成员变量都有一个对齐数)的整数倍

4. 如果嵌套了结构体的情况,嵌套的结构体对齐到自己的最大对齐数的整数倍处,

结构体的整体大小就是所有最大对齐数(含嵌套结构体的对齐数)的整数倍。

• 结构体内存的大小算每个占的字节数,只有放的时候才看对齐数

2.举例说明

(1)例一:计算结构体占多大空间

a.代码

#include

struct S1

{

char c1;

int i;

char c2;

};

int main()

{

printf("%d\n", sizeof(struct S1));

return 0;

}

b.分析

1d155a2b9b7f1679e98c4b58df3e9e78.png

红色部分就是因为要对齐,补位的字节数,补位的字节数不存储数据

只是为了对齐

c.运行结果

80087b6076cb8e307f8df5fbda2b233d.png

(2)例二:计算结构体的大小

a.代码

#include

struct S3

{

double d;

char c;

int i;

};

int main()

{

printf("%d\n", sizeof(struct S3));

return 0;

}

b.分析

0a305462cd23c17455fe1407a19dae4f.png

c.运行结果

bf86e56f2fd553740998a99d3a018abb.png

(3)例三:计算结构体的大小(结构体嵌套问题)

a.代码

#include

struct S3

{

double d;

char c;

int i;

};

struct S4

{

char c1;

struct S3 s3;

double d;

};

int main()

{

printf("%d\n", sizeof(struct S4));

return 0;

}

b.分析

8261a1144e7a789e09e485dcfd417447.png

c.运行结果

455fa4a5fbd3919558aac7b43d398c76.png

3.修改默认对齐数

#pragma pack(num) -------设置默认对齐数为num

#pragma pack() ----------取消设置的默认对齐数,还原为默认

#pragma pack(1) ----------相当于不对齐

(1)#pragma pack(num)将默认对齐数修改为2

此题中i的对齐数为2

#include

#pragma pack(2)//修改默认对齐数为2

struct S1

{

char c1; // 1

int i; // 4

char c2; // 1

};

int main()

{

printf("%d\n", sizeof(struct S1));

return 0;

}

60b8ae3ae3f003f2c99139b74f43094a.png

cbaa920ed754972c0973ecd1703248d5.png

(2)#pragma pack() 取消设置的的默认对齐数,还原默认

#pragma pack()以将修的的默认对齐数2还原为原默认值8

#include

#pragma pack(2)

#pragma pack()//取消修改的默认对齐数,还原为默认

struct S1

{

char c1; // 1

int i; // 4

char c2; // 1

};

int main()

{

printf("%d\n", sizeof(struct S1));

return 0;

}

61c1e37243e467bd1cf3bc1d210e10c5.png

1cce2329a4916e43ea6a5d152fe74122.png

(3)#pragma pack(1) 不对齐说明

#include

#pragma pack(1)//相当于不对齐

struct S1

{

char c1; // 1

int i; // 4

char c2; // 1

};

int main()

{

printf("%d\n", sizeof(struct S1));

return 0;

}

e7d328742cfaf2c86ba95dc7394ae2c5.png

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值