一、规则:
操作系统制定对齐量:
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