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 + 指数。
小数部分:
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 + 指数。
小数部分:
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)
网友评论