Swift ——String 与 Array

本文深入探讨了Swift中的String和Array的内存结构。对于String,重点讲述了空字符串的初始化,以及不同长度字符串的内存布局,包括_count、_variant、_discriminator等属性的含义。在Array部分,讨论了内存分配,包括_allocateUninitializedArray函数的作用,以及数组扩容时的realloc逻辑。还提到了访问String需要使用String.index的原因,涉及到Unicode和UTF-8编码的理解。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1. String

1.1 String 在内存中的存储

先创建一个空的字符串,运行后打印地址,看到只有一个有效消息0xe000000000000000。

在这里插入图片描述
打开源码查看,看到在String.swift里面有一个初始化空字符串的方法。

 public init() { self.init(_StringGuts()) }

在这里插入图片描述
那么看到StringGuts.swift方法里面,看到初始化空字符串的方法。
在这里插入图片描述
在看到StringObject.swift里面的empty方法。看到这里根据架构不同调用不同的初始化方法。
在这里插入图片描述
这里看到arm的结构调用的方法,这里对属性进行赋值。StringObject是一个结构体,这些属性是StringObject的成员变量,那么当对当前String字符串存储的就是这些成员变量。那么这些属性分别代表什么呢?
在这里插入图片描述
首先 _count 应该是代表当前字符串的大小。_variant在源码中寻找,看到其是一个枚举类型。而在之前的空字符串初始化方法中看到其传的是.immortal(0),其实际上代表的是原生的字符串。
在这里插入图片描述

接下来是_discriminator,之前初始化方法传入的是枚举变量的枚举值Nibbles.emptyString.找到其是空的。
在这里插入图片描述

在往下找看到其有拓展,并且传入是否为isASCII码。
在这里插入图片描述
看到small函数根据传进来的isASCII返回0xE000_0000_0000_0000或者是0xA000_0000_0000_0000。这个就是我们之前返回的0xe000000000000000,代表时ASCII码。
在这里插入图片描述
改变字符串,发现确实成了0xa.

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值