美文网首页简书首页iOS面试杂七杂八
iOS 开发 内存对齐(练习)

iOS 开发 内存对齐(练习)

作者: 强子ly | 来源:发表于2019-01-17 22:43 被阅读312次

目录

  • 内存对齐规则
  • 对齐系数
  • 面试题演练

一、内存对齐规则 (关于面试题中结构体内存对齐计算总结

  • 1.1、数据成员对齐规则

结构(struct)(或联合(union))的数据成员,第一个数据成员放在offset(偏移)为0的地方,以后每个数据成员的对齐按照 #pragma pack 指定的数值和这个数据成员自身长度中,比较小的那个进行

  • 1.2、结构(或联合)的整体对齐规则

在数据成员完成各自对齐之后,结构(或联合)本身也要进行对齐,对齐将按照 #pragma pack 指定的数值和结构(或联合)最大数据成员长度中,比较小的那个进行。

1.3:结构体作为成员:

如果一个结构里有某些结构体成员,则结构体成员要从其内部最大元素大小的整数倍地址开始存储。


二、#pragma pack(n) 对齐系数

        每个特定平台上的编译器都有自己的默认“对齐系数”(也叫对齐模数)。程序员可以通过预编译命令#pragma pack(n),n=1,2,4,8,16来改变这一系数,其中的n就是你要指定的“对齐系数”。
        其中,Xcode 中默认为#pragma pack(8)


三、演练

演练1、

struct StructOne { 
                 长度        对齐      偏移     区间
    char   a;       1  < 8     1         0      [0]     
    double b;       8  = 8     8         8      [8,  15]
    int    c;       4  < 8     4         16     [16, 19]
    short  d;       2  < 8     2         20     [20, 21]
} MyStruct1;

解读:
1、数据成员的对齐按照#pragma pack-8和自身长度中比较小的那个进行
-- char a 的自身长度为 1, 1 < 8, 按 1 对齐

2、第一个数据成员放在offset为0的地方
-- char a 的偏移为 1

3、整体对齐系数 = min((max(int,short,char,double), 8) = 8,
   将 21 提升到 8 的倍数,则为 24,所以最终结果为 24 个字节

整体对齐系数 = min((max(int,short,char,double), 8) = 8,将21提升到8的倍数,则为24,所以最终结果为24个字节

演练2、
struct StructOne { 
                 长度        对齐      偏移     区间
    double b;       8  = 8     8         0      [0,   7]     
    char   a;       1  < 8     1         8      [8]
    short  d;       2  < 8     2         10     [10, 11]
    int    c;       4  < 8     4         12     [12, 15]
} MyStruct1;

解读:
这个和演练1不同的是short d,由于它是 2 对齐,上一个偏移量为 9,
9不是2的整数倍,所以向上取整,到10,"short b" 偏移为10

留给大家自己算的
struct x_ {
    char  a;      // 1 byte
    int   b;      // 4 bytes
    short c;      // 2 bytes
    char  d;      // 1 byte
} MyStruct1;

struct y_ {
    int   b;      // 4 bytes
    char  a;      // 1 byte
    char  d;      // 1 byte
    short c;      // 2 bytes
} MyStruct2;

NSLog(@"%lu,%lu", sizeof(MyStruct1), sizeof(MyStruct2));
12---8
struct StructOne {
    char   a;      // 1字节
    double b;      // 8字节
    int    c;      // 4字节
    short  d;      // 2字节
} MyStruct1;

struct StructTwo {
    double b;       // 8字节
    char   a;       // 1字节
    short  d;       // 2字节
    int    c;       // 4字节
} MyStruct2;
NSLog(@"%lu---%lu--", sizeof(MyStruct1), sizeof(MyStruct2));

2019-01-16 08:52:13.830861+0800 size[1031:10969] 24---16--
复杂一点演练(结构体包含结构体-明天解读)
struct EE
{                       长度        对齐      偏移     区间
    int     a;            4 < 8       4        0      [0, 3]
    char    b;            1 < 8       1        4      [4] 
    short   c;            2 < 8       2        6      [6, 7]
 //结构体内部最大元素为int ,由于偏移量为8刚好是4的整数倍,所以从8开始存放接下来的struct FF
    struct FF    
    {
        int   a1;         4 < 8       4        8      [8, 11]
        char  b1;         1 < 8       1        12     [12]      
        short c1;         2 < 8       2        14     [14, 15]    
        char  d1;         1 < 8       1        16     [16] 
    };
    // 整体对齐:min(max(int, char, short), 8) = 4, 将内存大小由17补齐到4的整数倍20
    char d;               1 < 8       1        21     [21] 
    // 整体对齐系数 = min((max(int,short,char), 8) = 4,将内存大小由21补齐到4的整数倍24
};
----24
struct B {           长度        对齐      偏移     区间
    char   e[2];        1 < 8      2        0      [0, 1]   
    short  h;           2 < 8      2        2      [2, 3]  
 //结构体内部最大元素为double ,由于偏移量为8刚好是4的整数倍,所以从8开始存放接下来的struct A
    struct A {  
        int    a;        4 < 8      4        8      [8, 11] 
        double b;        8 = 8      8        16     [16, 23]
        float  c;        4 < 8      4        24     [24, 27]
    };
        // 整体对齐系数 = min((max(int,double ,float), 8) = 8
        // 将内存大小由28补齐到8的整数倍32,∴ result = 32
};

----32

参考文章:
iOS 关于面试题中结构体内存对齐、类内存对齐计算总结
https://www.jianshu.com/p/a371e2613ec8
https://www.jianshu.com/p/3294668e2d8c

相关文章

  • iOS 开发 内存对齐(练习)

    目录 内存对齐规则 对齐系数 面试题演练 一、内存对齐规则 (关于面试题中结构体内存对齐计算总结) 1.1、数据成...

  • iOS内存对齐

    这篇文章我们来探索一下iOS内存对齐的原理,在探索完内存对齐原理之后,你就会明白内存对齐的好处。 在讲述内存对齐时...

  • iOS底层探究 - 内存对齐

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

  • iOS开发 内存对齐原理

    1.文字描述 数据成员对⻬规则:结构(struct)(或联合(union))的数据成员,第一个数据成员放在offs...

  • iOS开发之内存对齐

      我们先来看两个结构体:   在 架构下, 占用4个字节, 占用1个字节, 8个字节, 2个字节,那么结构体 和...

  • iOS Struct嵌套类型的内存分析

    一,为什么要内存对齐 在iOS开发过程中,甚至任何一门开发语言,对于内存的资源都是极其宝贵的,不能随意的浪费,所以...

  • iOS底层之内存对齐算法解析

    目前但凡一个iOS岗面试都会问个内存对齐问题,那么什么是字节对齐?成员变量对齐和对象内存对齐有什么区别?今天我来为...

  • iOS 内存对齐

    在上一边文章中,我们在简单介绍内存对齐,今天我们更加深入一点: 一、获取内存大小的三种方式 先看下面这段代码: 看...

  • iOS - 内存对齐

    1、内存对齐是什么? 在计算机中,内存大小的基本单位是字节,理论上来讲,可以从任意地址访问某种基本数据类型。 但是...

  • iOS 内存对齐

    前言 现代计算机中内存空间都是按照 byte 划分的,从理论上讲似乎对任何类型的变量的访问可以从任何地址开始,但是...

网友评论

    本文标题:iOS 开发 内存对齐(练习)

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