Swift中结构体与类的MemoryLayout内存大小差异原因咨询
结构体与类的内存布局大小差异解析
在Swift中,结构体是值类型,类是引用类型,这是两者通过MemoryLayout.size(ofValue:)获取的大小不同的核心原因:
1. 结构体(值类型)的内存计算
结构体A作为值类型,会直接将其所有属性的内存包含在自身的内存布局中。Swift的String类型在64位系统下,MemoryLayout<String>.size固定为16字节(内部包含指向存储的指针、长度等元数据),因此包含一个String属性的结构体A,其内存大小就是16字节,与String的内存大小完全一致。
2. 类(引用类型)的内存计算
类B是引用类型,实例化后,对象的实际数据(包括name属性)会存储在堆内存中,而你持有的变量本质上是一个指向堆中对象的指针。在64位系统下,指针的固定大小为8字节,因此MemoryLayout.size(ofValue:)返回的是这个指针的大小,而非堆中对象的实际内存占用。
验证代码示例
struct A { var name: String } class B { var name: String init(name: String) { self.name = name } } let a = A(name: "example") let b = B(name: "example") print(MemoryLayout.size(ofValue: a)) // 输出 16 print(MemoryLayout.size(ofValue: b)) // 输出 8
内容的提问来源于stack exchange,提问作者Kam12
相关产品推荐
相关产品推荐

