分析一下以下结构体占用内存的大小

265 阅读1分钟

分析一下以下结构体占用内存的大小

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

内存对⻬的原则

  1. 数据成员对⻬规则:结构(struct)(或联合(union))的数据成员,第

    一个数据成员放在offset为0的地方,以后每个数据成员存储的起始位置要

    从该成员大小或者成员的子成员大小(只要该成员有子成员,比如说是数组,

    结构体等)的整数倍开始(比如int为4字节,则要从4的整数倍地址开始存

    储。

  2. 结构体作为成员:如果一个结构里有某些结构体成员,则结构体成员要从

    其内部最大元素大小的整数倍地址开始存储.(struct a里存有struct b,b

    里有char,int ,double等元素,那b应该从8的整数倍开始存储.)。

  3. 收尾工作:结构体的总大小,也就是sizeof的结果,.必须是其内部最大

    成员的整数倍.不足的要补⻬。