一 C语言Struct结构体对齐的基本原则
1 首个成员的起始地址偏移为0,且为低地址
2 其它成员的首地址必须与其 自身大小size 或 #pragram pack (n),中较小的数对齐
3 结构体的总大小 一定是其 最大的成员变量大小s 的整数倍
struct test
{char a; //1short b; //2char c; //1
};
图上test结构体的大小为6字节。
#pragma pack(1)
struct test{char a;short b;char c;
};
该结构体的大小为4字节。
图上pragma强制结构体按照1字节对齐,因此该结构体的大小为4字节。
#pragma pack(1)
struct test{char a;int b;char c;
};
该结构体的大小为6字节
在使用了 #pragma pack(1) 强制 1字节对齐 的情况下,结构体 test 的成员会紧密排列,不插入任何填充字节,因此其总大小为 6字节,而非默认对齐规则下的倍数。
#pragma pack(n) 会强制指定对齐值为 n 字节,覆盖默认规则。
结构体大小无需是最大成员的倍数,因为对齐已被强制约束为 n 字节。
在需要节省内存或与硬件交互时,常用此指令消除填充,但会牺牲访问速度。
#pragma pack(8)
struct test{char a; // 1int b; // 4short c; // c
};
该结构体的大小为12字节
虽然pragma宏将对齐指定为8字节,但结构体test中最大的成员大小为4字节。编译器计算结构体的大小时,会按照 【最大成员变量大小】和【pragma指定宏】的最小值来对齐。