一、规则:
操作系统制定对齐量:
64位操作系统,默认8Byte对齐
32位操作系统,默认4Byte对齐
结构体对齐规则:
1.结构体整体的大小,需要是最大成员对齐量的整数倍
2.结构体中每一个成员的偏移量需要存在其对齐量整数倍的位置
3.成员的对齐量=成员本身的大小<操作系统对齐量?成员本身的大小:操作系统指定对齐量
(若成员大小>8,就取8,若成员大小<8,就取成员大小)
二、数据类型
类型 所占空间大小
int 4B
short int 2B
long int 64: 8B 32:4B
long long 8B
float 4B
double 8B
*p 64:8B 32:4B
三 、实例(默认都为64位)
1.
typedef struct Test
{int a; char c;double b;long int p;
}T;
成员对齐量=8B
解析:其中最大的为long int为8B
大小=24B
2.
typedef struct Stu
{char name[5]; int age; char sex; double score;
}S;
成员对齐量为:8B
大小=24B
3.
typedef struct A
{long int a; short b; int *p; float q;
}A;
成员对齐量=8
大小=32B
4.
struct C{char b;int a;short c;
};
成员对齐量=4B
解析:结构体最大的是int型,为4B
成员本身的大小<操作系统指定对齐量,4<8,所以成员对齐量=4B
大小=12B
5.结构体嵌套(先计算内部结构体,将内部的结构体对齐,再计算外部)
typedef struct Test{short a;struct {int b;double c;char d;}p;int e;
}Test;
成员对齐量=8B
大小=40B
6.
typedef struct Test {short a;struct {int b;double c[10];char d;};int e;
}Test;
成员变量=8B
大小=112B
7.指定对齐字节(#pragma pack() ,()中只能是2的幂次)
#pragma pack(2) //指定二字节对齐,()中只能是2的幂次
typedef struct
{char c; struct A{short a; int *b; char c; }p; long b; int a;
}T;
#pragma pack() //取消指定对齐
成员对齐量=2B
大小=26B