IT评测·应用市场-qidao123.com

标题: c语言 结构体对齐 [打印本页]

作者: 用多少眼泪才能让你相信    时间: 2025-3-14 00:21
标题: c语言 结构体对齐
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字节对齐(但需根据编译器实现确认)。
复制代码
  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企服之家,中国第一个企服评测及商务社交产业平台。




欢迎光临 IT评测·应用市场-qidao123.com (https://dis.qidao123.com/) Powered by Discuz! X3.4