#pragma pack(8)
为pack预处理命令,来禁止对齐调整
include <stdio.h>
#pragma pack(8)
struct S1
{
short a;
long b;
};
struct S2
{
char c;
struct S1 d;
double e;
};
int main()
{
struct S2 s2;
printf("%d\n", sizeof(struct S1));
printf("%d\n", sizeof(struct S2));
printf("%d\n", (int)&(s2.d) - (int)&(s2.c));
return 0;
}
64位的gcc下编译
- char 1字节
- shrot 2字节
- int 4字节
- long 8字节
- double 8字节
输出结果
16
32
8
分析struct S2
大小,8字节对齐
起始 | 大小 | 对齐参数 | 空出 |
---|---|---|---|
0 | 1 | 8 | 7 |
8 | 16 | 8 | 0 |
24 | 8 | 8 | 0 |
32 | 取得的32是1、 8 、16的公倍数 |
#pragma pack(4)
struct S2
{
char c;
short b
char d;
int i;
};
长度12个字节
dword数据的内存起始地址能被4除尽,word数据的内存起始地址能被2除尽。
起始 | 大小 | 对齐参数 | 空出 |
---|---|---|---|
0 | 1 | 4 | 1 |
2 | 2 | 4 | 0 |
4 | 1 | 4 | 3 |
8 | 4 | 4 | 0 |
12 | 可以 (起始) / (大小) |