zoukankan      html  css  js  c++  java
  • 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)

  • 相关阅读:
    set, unordered_set模板类
    C/C++ Bug记录
    win10远程连接
    C/C++缓冲区刷新问题
    hihocoder1711 评论框排版[并查集+set]
    makefile
    Virtual Table
    粤语
    xilinx SDK开发 GPIO使用API总结
    基于zynq 7020的串口UART中断实验
  • 原文地址:https://www.cnblogs.com/feng9exe/p/10643222.html
Copyright © 2011-2022 走看看