美文网首页
swift内存结构解析

swift内存结构解析

作者: 迷路的小小 | 来源:发表于2020-01-16 14:17 被阅读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
  • count <= 15 : "123456789ABCDEF" = 0 x 31 32 33 34 35 36 37 38 39 41 42 43 44 45 46 EF
  • count > 15 : "0 x 10 00 00 00 00 00 00 D0 40 7E 81 02 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)

相关文章

  • swift内存结构解析

    swift内存解析 Int 32位平台为Int32 64位平台为Int64 Float(32bit) 3123 -...

  • Swift学习-进阶02

    swift对象本质,一个swift的对象默认占用16字节大小,在内存中的结构: swift类结构: 属性 存储属性...

  • Swift

    lldb查看swift对象内存结构的方法fr v -R foo

  • xml解析--dom、sax、dom4j

    dom解析和sax解析区别: dom方式解析: 根据xml的层级结构在内存中分配一个数型结构,把xml的标签、属性...

  • 好好看,好好学

    Java部分 面向对象 java 内存JVM:图文解析 Java内存结构Java虚拟机内存管理——内存空间划分Ja...

  • JVM 内存结构解析

    1. JVM内存结构 (1) JDK1.7的JVM内存结构 JVM内存结构主要有三大块:堆内存、方法区和栈。 堆内...

  • JVM解析——内存结构

    本系列主要记录笔者在学习 [深入理解Java虚拟机] 一书时的理解我们都知道在Java中,我们并不需要过多的在意内...

  • JAVA内存结构解析

    原文链接:http://tryenough.com/java-memory-structure 更多:http:/...

  • Swift 4 JSON 解析指南

    Swift 4 JSON 解析指南 Swift 4 JSON 解析指南

  • Swift内存管理

    和OC一样,Swift中也是通过引用计数的方式来管理对象的内存的。在Swift类 结构探究[https://www...

网友评论

      本文标题:swift内存结构解析

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