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