c语言 结构体对齐

打印 上一主题 下一主题

主题 971|帖子 971|积分 2915

ARM7架构(基于ARMv4T)的结构体内存对齐遵照以下规则,以确保数据访问的精确性和服从。由于ARM7处理器不支持非对齐内存访问,编译器会通过填充字节来保证每个成员精确对齐:

  • ​成员对齐规则
    每个结构体成员的偏移所在必须是其范例大小或编译器默认对齐值(取较小者)的整数倍。
  1. ​char(1字节)​:1字节对齐,偏移地址可为任意。
  2. ​short(2字节)​:2字节对齐,偏移地址必须是偶数(如0x0, 0x2, 0x4等)。
  3. ​int/指针(4字节)​:4字节对齐,偏移地址必须是4的倍数(如0x0, 0x4, 0x8等)。
  4. ​double(8字节)​:在ARM7中通常视为两个4字节字,按4字节对齐(但需根据编译器实现确认)。
复制代码

  • ​结构体总大小对齐
    结构体的总大小必须是其最大成员对齐值的整数倍。例如,若最大成员是int(4字节对齐),则结构体大小必须是4的倍数,不足时末尾填充字节。
  • ​编译器填充策略
    编译器会在成员之间插入填充字节(Padding),确保下一个成员精确对齐。
    成员次序影响填充量,合理分列可减少内存占用。
    示例分析
  1. 示例1:默认成员顺序
  2. c
  3. struct S1 {
  4.     char a;      // 偏移0(1字节对齐)
  5.     // 填充3字节(偏移1-3)
  6.     int b;       // 偏移4(4字节对齐)
  7.     short c;     // 偏移8(2字节对齐)
  8. };               // 总大小=8+2=10,但需对齐到4→末尾填充2字节→总大小12字节。
  9. 示例2:优化成员顺序
  10. c
  11. struct S2 {
  12.     int b;       // 偏移0(4字节对齐)
  13.     char a;      // 偏移4(1字节对齐)
  14.     short c;     // 偏移6(填充1字节后,2字节对齐)
  15. };               // 总大小=6+2=8,已对齐到4→无需填充。
  16. 调整顺序后,结构体大小从12字节降至8字节。
复制代码
关键点总结
​硬件限制:ARM7不支持非对齐访问,编译器必须严格对齐。
​成员次序优化:合理分列成员可减少填充,节省内存。
​编译器指令:使用#pragma pack(n)或__attribute__((packed))可修改对齐规则,但大概导致性能下降或错误。
验证方法
  1. c
  2. #include <stdio.h>
  3. struct S1 { char a; int b; short c; };
  4. struct S2 { int b; char a; short c; };
  5. int main() {
  6.     printf("S1大小: %zu\n", sizeof(struct S1)); // 输出12
  7.     printf("S2大小: %zu\n", sizeof(struct S2)); // 输出8
  8.     return 0;
  9. }
复制代码
通过sizeof可验证结构体实际大小,结合调试器查看内存布局。

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

用多少眼泪才能让你相信

金牌会员
这个人很懒什么都没写!
快速回复 返回顶部 返回列表