zoukankan      html  css  js  c++  java
  • 浅析Swift中枚举的内存布局

    对于一般的定义方式:

    enum Direction {
          case north, south, east, west
    }

    对于内存的打印,我使用的github上的工具(工具连接),并且打印对象的分配大小、实际使用大小、内存对齐大小,代码如下:

    var dir = Direction.north
    print(Mems.ptr(ofVal: &dir))
    dir = .south
    dir = .east
     dir = .west
     print(MemoryLayout.stride(ofValue: dir))
     print(MemoryLayout.size(ofValue: dir))
     print(MemoryLayout.alignment(ofValue: dir))

    打印结果如下:

    0x00007ffeec8ef1c0
    1
    1
    1

    根据打印结果,分配内存为1个字节、实际内存为1个字节、内存对齐为1个字节

    若改变声明方式,声明的时候赋值原始值

    enum Direction: Int {
            
        case north = 4, south = 5, east = 6, west = 7
    }

    内存打印和上次一样,但是我对其进行每次赋值,为了区分从四开始赋值,每次地址打印储存值的打印情况如下:

    00 00 00 00 赋值为north
    01 00 00 00 赋值为south
    02 00 00 00 赋值为east
    03 00 00 00 赋值为weast

    根据打印结果,枚举地址存储的并不是原始值

    若生命值变为:

    enum TestEnum {
          case test1(Int, Int, Int, Int)
          case test2(Int, Int, Int)
          case test3(Int)
          case test4(Bool)
          case test5
     }

    此时我打印内存输出结果:

    0x00007ffeeadad1a0
    40
    33
    8

     总大小为40个字节 可以推算出是根据最大的test进行分配,4 个 int 32个字节,然后加上1 个字节,但是由于内存对齐需要8个字节,也就对应了总的字节数32 + 8,实际

    使用的字节数32 + 1,内存对齐为8

    当初始化代码为:

    var dir = TestEnum.test1(1, 1, 1, 1)
    01 00 00 00 00 00 00 00 
    01 00 00 00 00 00 00 00 
    01 00 00 00 00 00 00 00 
    01 00 00 00 00 00 00 00 
    00
    00 00 00 00 00 00 00 

    根据此时的内存打印对应我们之前预想的内存分配

    当初始化为:

    dir = TestEnum.test2(3, 3, 3)
    03 00 00 00 00 00 00 00 
    03 00 00 00 00 00 00 00 
    03 00 00 00 00 00 00 00 
    00 00 00 00 00 00 00 00
    01 
    00 00 00 00 00 00 00

    上面大概就是枚举的内存分配

     

  • 相关阅读:
    RSA
    DES
    MD5
    增删改查
    [转]数据绑定之DataFormatString
    分页通用存储过程(未验证)
    浅谈sql中的in与not in,exists与not exists的区别
    [转]order by 1是什么意思?
    bak骗子公司
    Performance Considerations for Entity Framework 4, 5, and 6
  • 原文地址:https://www.cnblogs.com/muzichenyu/p/13616781.html
Copyright © 2011-2022 走看看