美文网首页
结构体内存对齐分析

结构体内存对齐分析

作者: 为了自由的白菜 | 来源:发表于2020-09-08 17:31 被阅读0次

这里我们来分析结构体内存对齐方式, 从中我们可以间接的分析出在OC中内存的对齐方式大概什么样.

进行分析前我们要先知道不同类型的属性, 所对应的内存空间是什么. 如下:

C OC 32位 64位
bool BOOL(64位) 1 1
signed char (__signed char)int8_t BOOL(32位) 1 1
unsigned char Boolean 1 1
short int16_t 2 2
unsigned short unichar 2 2
int int32_t NSInteger(32位) boolean_t(32位) 4 4
unsigned int boolean_t(64位) NSInteger(32位) 4 4
long NSInteger(64位) 4 8
unsigned long NSInteger(64位) 4 8
long long int64_t 8 8
float CGFloat(32位) 4 4
double CGFloat(64位) 8 8

内存对齐的原则

  1. 数据成员对齐规则: 结构(struct)(或联合(union))的数据成员, 第一个数据成员放在offset为0的地方, 以后每个数据成员存储的起始位置要从该成员大小或者成员的子成员大小(只要该成员有子成员, 比如说是数组, 结构体等)的整数倍开始(比如int为4字节, 则要从4的整数倍地址开始存储).
  2. 结构体作为成员: 如果一个结构里有某些结构体成员, 则结构体成员要从其内部最大元素大小的整数倍地址开始存储. (struct a里存有struct b, b里有char, int, double等元素, 那b应该从8的整数倍开始存储.)
  3. 收尾工作: 结构体的总大小, 也就是sizeof的结果, 必须是其内部最大成员的整数倍, 不足的要补齐.

例子

struct LGStruct1 {  
    double a;   // 8 (0-7)  
    char b;     // 1 [8 1] (8)  
    int c;      // 4 [9 4] 9 10 11 (12 13 14 15)  
    short d;    // 2 [16 2] (16 17)  
}struct1;  
// 内部需要的大小为: 17  
// 最大属性 : 8  
// 结构体整数倍: 24  

struct LGStruct2 {  
    double a;   //8 (0-7)  
    int b;      //4 (8 9 10 11)  
    char c;     //1 (12)  
    short d;    //2 13 (14 15) - 16  
}struct2;  
// 内部需要的大小为: 16  
// 最大属性 : 8  
// 结构体整数倍: 16  

扩展结构体中有其他结构体

接上面代码分析:

struct LGStruct2 {  
    double a;   //8 (0-7)  
    int b;      //4 (8 9 10 11)  
    char c;     //1 (12)  
    short d;    //2 13 (14 15) - 16  
    struct LGStruct1 e;  // 这个需要17在例子1中以及分析很清晰了, 16 + 17 从17 ~ 33
}struct2;  
// 内部需要的大小为: 33  
// 最大属性 : 8  
// 结构体整数倍: 40 

struct LGStruct2 {  
    double a;   //8 (0-7)  
    int b;      //4 (8 9 10 11)  
    struct LGStruct1 e;  //16 + 17 = 34 从8的整数倍16开始
    char c;     //1 (40)  从40开始
    short d;    //2 41 42 - 42  
}struct2;  
// 内部需要的大小为: 42  
// 最大属性 : 8  
// 结构体整数倍: 48 

相关文章

  • 结构体

    1.结构体 2.结构体的内存对齐模式 编译器在编译一个结构的时候采用内存对齐模式,结构体总是以最大的成员最为对齐单...

  • ndk-基础知识

    数组和指针,数组指针,指针数组 结构体 内存对齐 内存对齐 结构体大小 S5DUD10BN083MHEJEX7TP...

  • 内存对齐详解

    1、什么是内存对齐假设我们声明两个变量: 2、结构体内存对齐规则 结构体所占用的内存与其成员在结构体中的声明顺序有...

  • iOS原理探索02-- 内存对齐

    结构体内存对齐 我们首先定义两个结构体,分别计算他们的内存大小,并讨论内存对齐原理 从两个结构体来看两者没啥大的区...

  • iOS 内存对齐

    一、结构体内存对齐 1.1 结构体内存对齐三大原则 数据成员对⻬规则结构体(struct)或联合体(union)的...

  • 从结构体内存对齐到OC对象内存对齐

    1、结构体内存对齐 结构体对齐规则:1:数据成员对⻬规则:结构(struct)(或联合(union))的数据成员,...

  • 结构体 字节对齐的练习

    结构体 字节对齐的练习 分析结构体大小struct S1 ...

  • iOS 内存对齐:结构体继承和结构体作为另一个结构体成员变量情况

    内存对齐规则就不赘述了,这里讨论下继承和结构体作为另一个结构体成员变量的情况下,结构体内如何进行内存对齐。以下测试...

  • 结构体

    结构体有名定义 无名定义 结构体嵌套定义 结构体内存对齐 结构体成员初始化 结构体变量引用 结构体的有名定义:直白...

  • 第一天,内存对齐

    一对齐规则: 1.非结构体类型 32位 4字节对齐,64位 8字节对齐 2.结构体类型 以结构体中,最大内存的整数...

网友评论

      本文标题:结构体内存对齐分析

      本文链接:https://www.haomeiwen.com/subject/kddjektx.html