• swift Class的内存布局


    class Human {

        //8 type or isa

        //retainCount

        var age: Int?//16

        var name: String?//16

        var nicknames: [String] = [String]()

        

        //返回指向 Human 实例头部的指针

        func headPointerOfClass() -> UnsafeMutablePointer<Int8> {

            let opaquePointer = Unmanaged.passUnretained(self as AnyObject).toOpaque()

            let mutableTypedPointer = opaquePointer.bindMemory(to: Int8.self, capacity: MemoryLayout<Human>.stride)

            return UnsafeMutablePointer<Int8>(mutableTypedPointer)

        }

    }

    MemoryLayout<Human>.size       //8

    let human = Human()

    let arrFormJson = ["goudan","zhaosi", "wangwu"]

    //拿到指向 human 堆内存的 void * 指针

    let humanRawPtr = UnsafeMutableRawPointer(human.headPointerOfClass())

    //nicknames 数组在内存中偏移 48byte 的位置(8+8+16+16)

    let humanNickNamesPtr =  humanRawPtr.advanced(by: 48).assumingMemoryBound(to: Array<String>.self)

    print(human.nicknames)

    //[]

    humanNickNamesPtr.initialize(to: arrFormJson)

    print(human.nicknames)

    human.nicknames           //["goudan","zhaosi", "wangwu"]

    let retainCount =  humanRawPtr.advanced(by: 8).assumingMemoryBound(to: Int8.self)

    print(retainCount.pointee)

  • 相关阅读:
    zr#955 折纸
    zr#954 分组
    p2513 [HAOI2009]逆序对数列
    p4161 [SCOI2009]游戏
    p4593 [TJOI2018]教科书般的亵渎
    622FThe Sum of the k-th Powers
    spoj1811 LCS
    后缀自动机
    p5342 [TJOI2019]甲苯先生的线段树
    p5339 [TJOI2019]唱、跳、rap和篮球
  • 原文地址:https://www.cnblogs.com/feng9exe/p/10643222.html
Copyright © 2020-2023  润新知