1.问题
struct LGStruct1 {
double a;
char b;
int c;
short d;
}struct1;
struct LGStruct2 {
double a;
int b;
char c;
short d;
}struct2;
NSLog(@"%lu-%lu",sizeof(struct1),sizeof(struct2));
输出打印
两个结构体的数据类型 一摸莫一样样,但是内存大小却不一样?
2.内存对其原则
1、数据成员对齐规则:结构体或者联合体的数据成员,第一个数据成员放在offset为0的地方,以后每个数据成员存储的起始位置要从该成员大小或者成员的子成员大小(只要该成员有子成员,比如数组,结构体等)的整数倍开始(比如int为4字节,则要从4的整数倍地址开始存储)。通俗来讲就是除了第一个位置,后面的每个成员存放的位置起始位置都要存放的那个成员(如果有子成员那就是子成员)的整数倍位置。
2、结构体作为成员:如果一个结构体里面有某些结构体成员,则结构体成员要从其内部最大元素大小的整数倍地址开始存储。
3、收尾工作:结构体的总大小,也就是sizeof的结果,必须是其内部最大成员的整数倍,不足的要补齐。
根据以上原则分析问题
LGStruct1
a double类型 8字节 占位[0-7]
b char类型 1字节 占位[8]
c int类型 4字节 占位[12-15] (为什么不是[9-12]?根据原则1,数据成员存储的起始位置要从该成员大小的整数倍开始)
d short类型 2字节 占位 [16-17]
根据原则3,必须为8的倍数,不足的要补齐。因此LGStruct1大小为24
同理可知LGStruct2的大小为16
各数据类型所占字节大小参考下图
3.作业
第一题:
struct LGStruct3 {
double a;
int b;
char c;
short d;
int e;
struct LGStruct1 str;
}struct3;
解:
a double类型8字节 [0~7]
b int类型4字节 [8~11]
c char类型1字节 [12]
d short类型2字节 [14~15](2的整数倍开始)
e int类型4字节 [16~19]
str LGStruct1大小24字节 [24~47](原则2:结构体成员要从其内部最大元素大小的整数倍地址开始存储)
struct3必须为8的整数倍,大小为48字节
第二题
struct LGStruct3 {
double a;
int b;
char c;
short d;
int e;
struct LGStruct2 str;
}struct3;
解:
a double类型8字节 [0~7]
b int类型4字节 [8~11]
c char类型1字节 [12]
d short类型2字节 [14~15](2的整数倍开始)
e int类型4字节 [16~19]
str LGStruct2大小16字节 [24~39](原则2:结构体成员要从其内部最大元素大小的整数倍地址开始存储)
struct3必须为8的整数倍,大小为40字节