分析一下以下结构体占用内存的大小
struct Struct1 {
double a; // 0-7
char c; // 8
int b; // 12 - 15
short d; // 16 - 17
}s1;
struct Struct2 {
double a; // 0-7
int b; // 8-12
char c; // 13
short d; // 14 - 15
}s2;
struct Struct3 {
double a; // 0 - 7
struct Struct1 s; // 8-15 16 20-23 24-25
}s3;
struct Struct4 {
double a1; // 0 - 7
double a; // 8 - 15
char c; // 16
int b; // 20 - 23
short d; // 24 - 25
}s4;
int main() {
NSLog(@"s1->%lu",sizeof(s1)); // 24
NSLog(@"s2->%lu",sizeof(s2)); // 16
NSLog(@"s3->%lu",sizeof(s3)); // s3->32
NSLog(@"s4->%lu",sizeof(s4)); // s4->32
return 0;
}
s3 等价于 s4
内存对⻬的原则
-
数据成员对⻬规则:结构(struct)(或联合(union))的数据成员,第
一个数据成员放在offset为0的地方,以后每个数据成员存储的起始位置要
从该成员大小或者成员的子成员大小(只要该成员有子成员,比如说是数组,
结构体等)的整数倍开始(比如int为4字节,则要从4的整数倍地址开始存
储。
-
结构体作为成员:如果一个结构里有某些结构体成员,则结构体成员要从
其内部最大元素大小的整数倍地址开始存储.(struct a里存有struct b,b
里有char,int ,double等元素,那b应该从8的整数倍开始存储.)。
-
收尾工作:结构体的总大小,也就是sizeof的结果,.必须是其内部最大
成员的整数倍.不足的要补⻬。