结构体为什么需要内部填充?
定义一个简单的结构体
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)
内存字节对齐规则:
-
对于结构的各个成员,第一个成员位于偏移为0的位置,以后每个数据成员的偏移量必须是
min
【#pragma pack()指定的数】,这个数据成员的自身长度) 的倍数。 -
在数据成员完成各自对齐之后,结构(或联合)本身也要进行对齐,对齐将按照
#pragma pack
指定的数值和结构(或联合)最大数据成员长度中,比较小的那个进行。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列01:轻松3步本地部署deepseek,普通电脑可用
· 25岁的心里话
· 按钮权限的设计及实现