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

iOS 结构体内存对齐分析

作者: 小糾丶羯 | 来源:发表于2020-09-08 16:40 被阅读0次

一、结构体

结构体,我们可以将它当做一种数据类型,并且是一个集合类的数据类型,它的数据成员可以是基础数据类型(int、double、float、bool等),也可以是指针,甚至于是其他的结构体
下面是一个结构体的定义示例:

struct XBPerson {
    NSString *name;
    int age;
} person;

二、结构体的size大小

既然结构体作为一个集合类的数据类型,可以存储不同的数据,那它的size大小是怎么计算的呢?
1、一些数据类型占用的内存大小

一些数据类型占用的内存大小
2、内存对齐的原则
1.数据成员对齐规则:第一个数据成员的起始位置是0,之后数据成员的起始位置必须是成员自身大小的整数倍
2.结构体作为成员:该结构体成员的起始位置必须是其内部最大成员大小的整数倍
3.收尾工作:结构体的总大小(sizeof),必须是其内部最大成员大小的整数倍,不足的需要补齐。

三、分析

1、一般结构体分析
首先定义一个结构体Struct1,如下:

struct Struct1 {
    double a;       //8字节
    char   b;       //1字节
    int    c;       //4字节
    short  d;       //2字节
} struct1;

结合内存对齐的原则,我们对这个结构体进行分析:
1、a,是double类型,占用了8个字节的内存,并且是第一个数据成员,所以a的起始位置是0,范围是[0,7]。
2、b,是char类型,占用了1个字节的内存,所以b的起始位置是8(8是1的整数倍),范围是[8]。
3、c,是int类型,占用了4个字节的内存,所以c的起始位置是12(9、10、11都不是4的整数倍,故从12开始),范围是[12,15]。
4、d,是short类型,占用了2个字节的内存,所以d的起始位置是16,范围是[16,17]。
所以当前结构体Struct1需要的大小是[0,17],也就是18字节。但是根据原则3,Struct1中最大成员是double(大小8字节),18不是8的整数倍,必须补齐,所以最终Struct1的大小是24。

这里我们代码实际操作一下:如图:

一般结构体size 2、结构体嵌套结构体分析
1、首先定义一个结构体Struct2,如下:
struct Struct2 {
    double a;       //8字节
    char   b;       //1字节
    double c;       //8字节
    struct Struct1 struct1;
} struct2;

2、a、b、c分析同上,其中c的范围是[12,19],至于数据成员结构体struct1的起始位置,根据原则2(结构体成员的起始位置必须是其内部最大成员大小的整数倍,也就是double 8字节的整数倍),20无法满足条件,所以struct1的起始位置是24,范围是[24,47],所以struct2的范围是[0,47],大小为48。

这里我们代码实际操作一下:如图: 结构体嵌套结构体size

相关文章

  • 带你深入理解iOS-内存对齐

    前言 在iOS底层源码学习中,会需要分析一个结构体所占用的内存大小,这里面就涉及到了内存对齐 今天,我将结合内存对...

  • iOS-内存对齐

    先上个图,待会计算内存时会用到。 hxdm,已知iOS对象的本质是结构体,所以探索内存对齐当然是从结构体开始啦。来...

  • 结构体

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

  • ndk-基础知识

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

  • 内存对齐详解

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

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

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

  • iOS底层探究 - 内存对齐

    目录1:内存对齐的原因2:内存对齐的规则3:结构体内存分配演练以及在iOS中对象成员的内存分配探索 一 :内存对齐...

  • iOS 内存对齐

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

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

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

  • 结构体 字节对齐的练习

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

网友评论

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

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