结构体为什么需要内部填充?

3 篇文章 0 订阅

参考文章:alignment and padding

定义一个简单的结构体

struct {
	char a[3];
	short int b;
	long int c;
	char d[3];
}

理想内存结构

+-------+-------+-------+-------+
|           a           |   b   |
+-------+-------+-------+-------+
|   b   |           c           |
+-------+-------+-------+-------+
|   c   |           d           |
+-------+-------+-------+-------+

基本上,是连续的一段内存,但大多数编译器来讲却不是这样的。

实际内存结构

+-------+-------+-------+
|           a           |
+-------+-------+-------+
|       b       |
+-------+-------+-------+-------+
|               c               |
+-------+-------+-------+-------+
|           d           |
+-------+-------+-------+

这样排列,对于编辑器来讲,容易实现。
对于一些大多数处理器来讲,它们不太可能会识别出2-4字节的数量

解决办法

引入字节对齐方案,就是填充一些看不见的字段,这些字段对我们来说没有多大的用处,但它仍然要占用一定的内存空间。

+-------+-------+-------+-------+
|           a           | pad1  |
+-------+-------+-------+-------+
|       b       |     pad2      |
+-------+-------+-------+-------+
|               c               |
+-------+-------+-------+-------+
|           d           | pad3  |
+-------+-------+-------+-------+

如果不使用字节对齐,可以考虑下面代码:

#param pack(1)

内存字节对齐规则:

  1. 对于结构的各个成员,第一个成员位于偏移为0的位置,以后每个数据成员的偏移量必须是min【#pragma pack()指定的数】,这个数据成员的自身长度) 的倍数。

  2. 在数据成员完成各自对齐之后,结构(或联合)本身也要进行对齐,对齐将按照#pragma pack指定的数值和结构(或联合)最大数据成员长度中,比较小的那个进行。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Fy哥

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值