Utils for viewing memory in Swift.
用来窥探Swift内存的小工具
func show<T>(val: inout T) {
print("-------------- \(type(of: val)) --------------")
print("变量的地址:", Mems.ptr(ofVal: &val))
print("变量的内存:", Mems.memStr(ofVal: &val))
print("变量的大小:", Mems.size(ofVal: &val))
print("")
}
func show<T>(ref: T) {
print("-------------- \(type(of: ref)) --------------")
print("对象的地址:", Mems.ptr(ofRef: ref))
print("对象的内存:", Mems.memStr(ofRef: ref))
print("对象的大小:", Mems.size(ofRef: ref))
print("")
}
var int8: Int8 = 10
show(val: &int8)
// -------------- Int8 --------------
// 变量的地址: 0x00007ffeefbff598
// 变量的内存: 0x0a
// 变量的大小: 1
var int16: Int16 = 10
show(val: &int16)
// -------------- Int16 --------------
// 变量的地址: 0x00007ffeefbff590
// 变量的内存: 0x000a
// 变量的大小: 2
var int32: Int32 = 10
show(val: &int32)
// -------------- Int32 --------------
// 变量的地址: 0x00007ffeefbff588
// 变量的内存: 0x0000000a
// 变量的大小: 4
var int64: Int64 = 10
show(val: &int64)
// -------------- Int64 --------------
// 变量的地址: 0x00007ffeefbff580
// 变量的内存: 0x000000000000000a
// 变量的大小: 8
enum TestEnum {
case test1(Int, Int, Int)
case test2(Int, Int)
case test3(Int)
case test4(Bool)
case test5
}
var e = TestEnum.test1(1, 2, 3)
show(val: &e)
// -------------- TestEnum --------------
// 变量的地址: 0x00007ffeefbff580
// 变量的内存: 0x0000000000000001 0x0000000000000002 0x0000000000000003 0x0000000000000000
// 变量的大小: 32
e = .test2(4, 5)
show(val: &e)
// -------------- TestEnum --------------
// 变量的地址: 0x00007ffeefbff580
// 变量的内存: 0x0000000000000004 0x0000000000000005 0x0000000000000000 0x0000000000000001
// 变量的大小: 32
e = .test3(6)
show(val: &e)
// -------------- TestEnum --------------
// 变量的地址: 0x00007ffeefbff580
// 变量的内存: 0x0000000000000006 0x0000000000000000 0x0000000000000000 0x0000000000000002
// 变量的大小: 32
e = .test4(true)
show(val: &e)
// -------------- TestEnum --------------
// 变量的地址: 0x00007ffeefbff580
// 变量的内存: 0x0000000000000001 0x0000000000000000 0x0000000000000000 0x0000000000000003
// 变量的大小: 32
e = .test5
show(val: &e)
// -------------- TestEnum --------------
// 变量的地址: 0x00007ffeefbff580
// 变量的内存: 0x0000000000000000 0x0000000000000000 0x0000000000000000 0x0000000000000004
// 变量的大小: 32
struct Date {
var year = 10
var test = true
var month = 20
var day = 30
}
var s = Date()
show(val: &s)
// -------------- Date --------------
// 变量的地址: 0x00007ffeefbff580
// 变量的内存: 0x000000000000000a 0x0000000000000001 0x0000000000000014 0x000000000000001e
// 变量的大小: 32
class Point {
var x = 11
var test = true
var y = 22
}
var p = Point()
show(val: &p)
// -------------- Point --------------
// 变量的地址: 0x00007ffeefbff590
// 变量的内存: 0x0000000101023680
// 变量的大小: 8
show(ref: p)
// -------------- Point --------------
// 对象的地址: 0x0000000101023680
// 对象的内存: 0x00000001000072d8 0x0000000200000002 0x000000000000000b 0x0000000000000001 0x0000000000000016 0x3030303030303030
// 对象的大小: 48
var arr = [1, 2, 3, 4]
show(val: &arr)
// -------------- Array<Int> --------------
// 变量的地址: 0x00007ffeefbff598
// 变量的内存: 0x0000000101023800
// 变量的大小: 8
show(ref: arr)
// -------------- Array<Int> --------------
// 对象的地址: 0x0000000101023800
// 对象的内存: 0x00007fff9c30f848 0x0000000200000002 0x0000000000000004 0x0000000000000008 0x0000000000000001 0x0000000000000002 0x0000000000000003 0x0000000000000004
// 对象的大小: 64
var str1 = "123456789"
// taggerPtr(tagger pointer)
print(str1.mems.type())
show(val: &str1)
// -------------- String --------------
// 变量的地址: 0x00007ffeefbff580
// 变量的内存: 0x3837363534333231 0xe900000000000039
// 变量的大小: 16
var str2 = "1234567812345678"
// text(字符串存储在TEXT段)
print(str2.mems.type())
show(val: &str2)
// -------------- String --------------
// 变量的地址: 0x00007ffeefbff570
// 变量的内存: 0xd000000000000010 0x8000000100007610
// 变量的大小: 16
var str3 = "1234567812345678"
str3.append("9")
// heap(字符串存储在堆空间)
print(str3.mems.type())
show(val: &str3)
// -------------- String --------------
// 变量的地址: 0x00007ffeefbff560
// 变量的内存: 0xf000000000000011 0x00000001007b6ad0
// 变量的大小: 16
show(ref: str3)
// -------------- String --------------
// 对象的地址: 0x00000001007b6ad0
// 对象的内存: 0x00007fff963e9660 0x0000000200000002 0x0000000000000018 0xf000000000000011 0x3837363534333231 0x3837363534333231 0x0000000000200039 0x0000000000000000
// 对象的大小: 64
var int64: Int64 = 10
print("1个字节为1组 :", Mems.memStr(ofVal: &int64, alignment: .one))
// 1个字节为1组 : 0x0a 0x00 0x00 0x00 0x00 0x00 0x00 0x00
print("2个字节为1组 :", Mems.memStr(ofVal: &int64, alignment: .two))
// 2个字节为1组 : 0x000a 0x0000 0x0000 0x0000
print("4个字节为1组 :", Mems.memStr(ofVal: &int64, alignment: .four))
// 4个字节为1组 : 0x0000000a 0x00000000
print("8个字节为1组 :", Mems.memStr(ofVal: &int64, alignment: .eight))
// 8个字节为1组 : 0x000000000000000a