计算法则
- 结构体成员的偏移量,是其成员的大小的整数倍(0是被认为是所有数的整数倍)
- 结构体的大小必须是所有成员大小的整数倍
- 结构体中数组,结构体只计算其大小,不参与法则判定,
1.结构体成员的偏移量,是其成员的大小的整数倍(0是被认为是所有数的整数倍)
对于char a,偏移量为0,大小为1,0为所有数整数倍
char b 偏移量为1,大小为1
int c 偏移量为2 大小为4,根据条件需要空出2个字节使得偏移量变为4,才为4字节整数倍
整个结构体大小为:a的1字节,b的1字节,c的4字节加上空出来的2字节,总共8字节
struct T1{ //偏移量 大小
char a; //0 1
char b; //1 1
int c; //2 4 (空出2个字节)
//结构体大小: 1+1+2+4=8
};
2.结构体的大小必须是所有成员大小的整数倍
对于char a,偏移量为0,大小为1,0为所有数整数倍
int b 偏移量为1 大小为4,空出3个字节
char c偏移量为8字节,大小为1字节,目前总字节数是1+4+3+1 = 9,但9不是int型4 字节的整数倍,所以最小公倍数为12,结构体大小为12
struct T1{ //偏移量 大小
char a; //0 1
int b; //1 4 (空出3个字节)
char c; //8 1
//结构体大小: 1+4+3+1=9, 根据法则,9不是4的整数倍,所以为12
};
3.结构体含有数组
前两个变量还是一样的计算,字符不用考虑法则1,2,所以直接加上数组的大小,同时不考虑数组的偏移量与大小的关系
struct T1{ //偏移量 大小
char a; //0 1
int b; //1 4 (空出3个字节)
char c[13]; //8 13 (数组不包含在法则内,还是13个字节无空出字节)
//结构体大小: 1+4+3+13=21, 根据法则,21不是4的整数倍,所以为24
};
3.结构体含有结构体
结构体内的结构体定义与否会影响整个和结构体大小,但任然不参与法则判定
- 对于解结构内的结构体,如果内部结构体声明了结构体却没定义,那么其大小不计算在整个结构体的大小内
struct T1{ //偏移量 大小
char a; //0 1
int b; //1 4 (空出3个字节)
struct T2{ //声明无大小
char c;
int d;
};
float e; //8 4
//1+4+3+4 = 12
};
如果不定义结构体T2变量,直接打印sizeof(struct T1)
,在Linux下会警告
- 前面a,b同理,结构体类型的成员变量继续偏移算结构体总大小,此时T2声明并定义了变量temp,易得T2结构体大小为8,e偏移了16字节,大小为4没有多余空出字节,所以大小为1+4+3+8(结构体)+4=20;
struct T1{ //偏移量 大小
char a; //0 1
int b; //1 4 (空出3个字节)
struct T2{ //整各大小为8
char c; //0 1
int d; //1 4 (空出3个字节)
}temp;
float e; //16 4
//1+4+3+1+4+3+4 = 20
};