swift内存结构解析

2020-01-16  本文已影响0人  迷路的小小

swift内存解析

Int

32位平台为Int32

let num = 10
/// 0A 00 00 00

64位平台为Int64

let num = 10
/// 0A 00 00 00 00 00 00 00

Float(32bit)

let gread: Float = 12.2
// 33 33 43 41
31 23 - 30 0 - 22
符号位 8bit 指数位 23bit 尾数位

符号位:0代表正,1代表为负

指数位:存储科学计数法中的指数数据,127 + 指数。

12.2 = 0b1100.0011 0011 0011 0011 0011 = 0b1.100 0011 0011 0011 0011 0011 \times 2^3

127 + 3 = 130 = 0b1000 0010

小数部分:0.100 0011 0011 0011 0011 0011

0 1000 0010 100 0011 0011 0011 0011 0011 = 0x41 43 33 33

Double(64bit)

let gclass: Double
/// 66 66 66 66 66 66 28 40
63 62 - 52 0 - 51
符号位 11bit 指数位 52bit 尾数位

符号位:0代表正,1代表为负

指数位:存储科学计数法中的指数数据,1023 + 指数。

12.2 = 0b1100.0011 0011 0011 0011 0011 0011 0011 0011 0011 0011 0011 0011 0

= 0b1.100 0011 0011 0011 0011 0011 0011 0011 0011 0011 0011 0011 0011 0 \times 2^3

1023 + 3 = 1026 = 0b100 0000 0010

小数部分:0.100 0011 0011 0011 0011 0011 0011 0011 0011 0011 0011 0011 0011 0

0 100 0000 0010 100 0011 0011 0011 0011 0011 0011 0011 0011 0011 0011 0011 0011 0 = 0x40 28 66 66 66 66 66 66

String

var name: String = "1234" 
// 31 32 33 34 00 00 00 00 00 00 00 00 00 00 00 E4
// E4 表示长度为4
name += "56789ABCDEF"
// 31 32 33 34 35 36 37 38 39 41 42 43 44 45 46 EF
// EF 表示长度为15
name += "0"
// 10 00 00 00 00 00 00 D0 40 7E 81 02 01 00 00 80
// 10 00 00 00 00 00 00 D0 40 8E 83 04 01 00 00 80

enum

enum Grade {
    case first, sencond
}
MemoryLayout<Grade>.size // 1
MemoryLayout<Grade>.stride // 1
MemoryLayout<Grade>.alignment // 1
var grade1 = Grade.first // 00
var grade2 = Grade.sencond // 01
enum Grade {
    case first(name: String), sencond, third, five
}
MemoryLayout<Grade>.size // 16 = String.size
MemoryLayout<Grade>.stride // 16 = String.stride
MemoryLayout<Grade>.alignment // 8 = String.alignment
// 74 6F 6D 74 6F 6D 00 00 00 00 00 00 00 00 00 E6
var grade1 = Grade.first(name: "tomtom")
// 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
var grade2 = Grade.sencond
// 00 00 00 00 00 00 00 00 01 00 00 00 00 00 00 00
var grade3 = Grade.third
// 00 00 00 00 00 00 00 00 02 00 00 00 00 00 00 00
var grade4 = Grade.five

struct

struct Student {
    let name: String
    let num: Int
    let gread: Float
    let gclass: Double
}
var studen = Student(name: "123456789ABCDEF0", num: 10, gread: 12.2, gclass: 12.2)

对齐

func offset<T, U>(_ pre: T.Type?, _ current: U.Type, size: Int) -> Int {
    var tsize = 0
    
    if pre != nil {
        tsize = MemoryLayout<T>.size
    }
    let usize = MemoryLayout<U>.size
    tsize += (size + tsize) % usize == 0 ? 0 : (size + tsize) % usize
    return tsize
}
func alignmentStruct() -> (Int, Int, Int) {
    var size = 0, alignment = 1
    alignment = max(1, MemoryLayout<String>.alignment)
    
    let numOffset = offset(String.self, Int.self, size: size)
    size += numOffset
    alignment = max(alignment, MemoryLayout<Int>.alignment)
    
    let greadOffset = offset(Int.self, Float.self, size: size)
    size += greadOffset
    alignment = max(alignment, MemoryLayout<Float>.alignment)
    
    let gclassOffset = offset(Float.self, Double.self, size: size)
    size += gclassOffset
    alignment = max(alignment, MemoryLayout<Double>.alignment)
    
    return (numOffset, greadOffset, gclassOffset)
}

地址

// 结构体首地址,也是name地址
var headPoint = withUnsafeMutablePointer(to: &studen, {
    return UnsafeMutableRawPointer($0).bindMemory(to: UInt8.self, capacity: MemoryLayout<Student>.stride)
})
// 读取内存内的值
let name = headPoint.withMemoryRebound(to: String.self, capacity: 1, { Array(UnsafeBufferPointer(start: $0, count: 1)) })
print(name) // ["123456789ABCDEF0"]
let st = alignmentStruct()
// num的地址
headPoint = headPoint.advanced(by: st.0)
// gread的地址
headPoint = headPoint.advanced(by: st.1)
// gclass的地址
headPoint = headPoint.advanced(by: st.2)

class

无继承

class AClass {
    let name: String
    let gread: Float
    let gclass: Double
    
    init(_ name: String, gread: Float, gclass: Double) {
        self.name = name
        self.gread = gread
        self.gclass = gclass
    }
}
var aClass = AClass("123456789ABCDEF0", gread: 12.2, gclass: 12.4)

对齐

func alignmentOfAClass() -> (Int, Int) {
    var size = 0, alignment = 1
    alignment = max(1, MemoryLayout<String>.alignment)
    
    let greadOffset = offset(String.self, Float.self, size: size)
    size += greadOffset
    alignment = max(alignment, MemoryLayout<Float>.alignment)
    
    let gclassOffset = offset(Float.self, Double.self, size: size)
    size += gclassOffset
    alignment = max(alignment, MemoryLayout<Double>.alignment)
    
    return (greadOffset, gclassOffset)
}

地址

// 首地址
let aPointUn = Unmanaged.passUnretained(aClass).toOpaque()
var aPoint = UnsafeMutablePointer<UInt8>(aPointUn.bindMemory(to: UInt8.self, capacity: MemoryLayout<AClass>.stride))
// 无父类 变量首地址(name)=类首地址+8+(64bit->8 32bit->4)
aPoint = aPoint.advanced(by: 8) // 类的类型信息
aPoint = aPoint.advanced(by: 8) // 引用计数相关
let namec = aPoint.withMemoryRebound(to: String.self, capacity: 1, {Array(UnsafeBufferPointer(start: $0, count: 1))})
print(namec) // ["123456789ABCDEF0"]
let ast = alignmentOfAClass()
// gread的地址
aPoint = aPoint.advanced(by: ast.0)
// gclass的地址
aPoint = aPoint.advanced(by: ast.1)

继承

class BClass: AClass {
    let git: String
    let fit: String
    
    init(git: String, fit: String, name: String, gread: Float, gclass: Double) {
        self.git = git
        self.fit = fit
        super.init(name, gread: gread, gclass: gclass)
    }
}

对齐

func alignmentOfBClass() -> (Int, Int, Int, Int) {
    var size = 0, alignment = 1
    alignment = max(1, MemoryLayout<String>.alignment)
    
    let greadOffset = offset(String.self, Float.self, size: size)
    size += greadOffset
    alignment = max(alignment, MemoryLayout<Float>.alignment)
    
    let gclassOffset = offset(Float.self, Double.self, size: size)
    size += gclassOffset
    alignment = max(alignment, MemoryLayout<Double>.alignment)
    
    let gitOffset = offset(Double.self, String.self, size: size)
    size += gitOffset
    alignment = max(alignment, MemoryLayout<String>.alignment)
    
    let fitOffset = offset(String.self, String.self, size: size)
    size += fitOffset
    alignment = max(alignment, MemoryLayout<String>.alignment)
    return (greadOffset, gclassOffset, gitOffset, fitOffset)
}

地址

let opBClass = Unmanaged.passUnretained(bClass).toOpaque()
var hBClass = UnsafeMutablePointer(opBClass.bindMemory(to: UInt8.self, capacity: MemoryLayout<BClass>.size))
hBClass = hBClass.advanced(by: 8).advanced(by: 8)
let nameB = hBClass.withMemoryRebound(to: String.self, capacity: 1, {Array(UnsafeBufferPointer(start: $0, count: 1))})
print(nameB)
let bst = alignmentOfBClass()
// gread的地址
hBClass = hBClass.advanced(by: bst.0)
// gclass的地址
hBClass = hBClass.advanced(by: bst.1)
// git地址
hBClass = hBClass.advanced(by: bst.2)
// fit地址
hBClass = hBClass.advanced(by: bst.3)
上一篇 下一篇

猜你喜欢

热点阅读