美文网首页
iOS中的字节对齐

iOS中的字节对齐

作者: Onego | 来源:发表于2019-12-18 18:39 被阅读0次

字节对齐的原则:

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

Struct的字节对齐

struct的顺序存放有一定的规则

    1. struct在内存中是连续存放的,利用这点可以对struct进行强制转化(只要定义相同即可)。
    1. struct定义的结构体在内存中是连续存放的。所以,数组结构可以与结构体互相转化。只需要强制转化一下即可。但是要注意struct结构体字节对其的问题,注意不同数据类型的定义先后。

案例1:

struct LGStruct1 {
    char a;     // size:1 , offset:0 , 0 ~ 0        1   (8的倍数补齐,8)
    double b;   // size:8 , offset:8 , 8 ~ 15       16
    int c;      // size:4 , offset:16 , 16 ~ 19     20
    short d;    // size:2 , offset:20 , 20 ~ 21     22  (8的倍数补齐,24)
} MyStruct1;

        char *a = (void *)&MyStruct1;
        double *b = (void *)&MyStruct1.b;
        int *c = (void *)&MyStruct1.c;
        short *d = (void *)&MyStruct1.d;

/*
查看内存情况(iOS 小端存储)
 (lldb) po sizeof(MyStruct1)   
 24
 (lldb) x &MyStruct1
 0x100002538: 61 00 00 00 00 00 00 00 00 00 00 00 00 00 f0 3f  a..............?
 0x100002548: 02 00 00 00 03 00 00 00 00 00 00 00 00 00 00 00  ................
 (lldb) p &MyStuct1
 error: use of undeclared identifier 'MyStuct1'
 (lldb) p &MyStruct1
 (LGStruct1 *) $1 = 0x0000000100002538
 (lldb) p a
 (char *) $2 = 0x0000000100002538 "a"
 (lldb) p b
 (double *) $3 = 0x0000000100002540
 (lldb) p c
 (int *) $4 = 0x0000000100002548
 (lldb) p d
 (short *) $5 = 0x000000010000254c
 */

上面的案例很好理解 来个特殊极端的

案例2:

struct LGStruct2 {
    double b;   // size:8 , offset:0 , 0 ~ 7        8
    char a;     // size:1 , offset:8 , 8 ~ 8        9   (8的倍数补齐,8)
    int c;      // size:4 , offset:12 , 12 ~ 15      20
    short d;    // size:2 , offset:16 , 16 ~ 17      22  (8的倍数补齐,24)
} MyStruct2;

struct LGStruct3 {
    double b;   // size:8 , offset:0 , 0 ~ 7        8
    int c;      // size:4 , offset:11 , 8 ~ 11      12
    char a;     // size:1 , offset:12 , 12 ~ 12      13
    short d;    // size:2 , offset:14 , 14 ~ 15      16 
} MyStruct3;

(lldb) p sizeof(MyStruct2)
(unsigned long) $6 = 24
(lldb) p sizeof(MyStruct3)
(unsigned long) $0 = 16

MyStruct3 中的a和d的内存分布有点奇怪。

总结一下:

1、第一个参数 从offset 0位置开始
2、第二个参数开始,以当前参数sizeof的倍数补齐
3、最后 以8的倍数补齐

相关文章

  • iOS底层原理--内存对齐

    在iOS底层原理--alloc&init&new这篇文章中,我们认识到了字节对齐。那么,我们回顾一下什么是字节对齐...

  • iOS中的字节对齐

    字节对齐的原则:数据成员对⻬规则:结构(struct)(或联合(union))的数据成员,第一个数据成员放在off...

  • iOS 字节对齐

    前言:在上一篇文章中,我们了解到,OC 底层的alloc 到底做了哪些事情。总结起来就是: 1、计算内存大小 2、...

  • 【待更新】C++中的字节对齐

    C++中的字节对齐

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

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

  • iOS内存对齐浅识

    在alloc的运行流程中我们提到了关于iOS16字节对齐的作用,那么在这篇文章中我们讨论一下,关于内存对齐的一些具...

  • iOS 内存字节对齐

    通过一段代码来描述内存对齐的现象。 上述代码打印出来的结果为:24,16 为什么相同的结构体,只是交换了变量 ab...

  • iOS 内存字节对齐

    一、代码 Demo 可以看到 Struct1、Struct2、Struct3 的成员变量的数据类型都是相同的,仅仅...

  • C++中的字节对齐

    1.C++中的字节对齐 字节对齐解释:现代计算机中内存空间都是按照字节划分的,从理论上来说对任何类型变量的访问可以...

  • 字节对齐与大端小端与内存区域划分

    字节对齐 C语言字节对齐C语言字节对齐/7213465 大端小端 字节序(大小端)详解从高低地址和高低位开始理解(...

网友评论

      本文标题:iOS中的字节对齐

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