Swift中类内String类型属性的内存存储位置咨询
类中String属性的存储位置说明
先澄清一个容易混淆的点:别被“值类型存栈、引用类型存堆”的简化说法限制——Swift编译器会根据实际场景做优化,但针对你这个问题,可以拆解得很清楚:
ABC是类(引用类型),它的实例对象整体存储在堆区。String虽然属于结构体(值类型),但内部设计比较特殊:底层通过指针指向实际的字符串数据(毕竟长字符串根本放不下栈区的有限空间)。而且像空字符串""这类固定值,Swift会做全局复用优化,无需每次分配新内存。- 回到
ABC里的str属性:- 作为
ABC实例的一部分,str的结构体元数据(包括指向字符串内容的指针、字符串长度、哈希值等)会跟着ABC实例一起存在堆区中。 - 如果是普通非空字符串,它的实际字符数据会存在堆区的另一块独立内存;如果是空字符串,
str的指针会直接指向全局预存的空字符串实例(同样在堆区的常量区域)。
- 作为
简单总结:类内的String属性,不管是结构体本身的元数据还是实际的字符串内容,全都在堆区,和栈区没有关联。
内容的提问来源于stack exchange,提问作者Daksh Sabharwal
相关产品推荐
相关产品推荐

