<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:content="http://purl.org/rss/1.0/modules/content/"><channel><title>值语义 on Last Stand</title><link>https://amatsuzero.github.io/LastStand/tags/%E5%80%BC%E8%AF%AD%E4%B9%89/</link><description>Recent content in 值语义 on Last Stand</description><generator>Hugo</generator><language>zh-cn</language><lastBuildDate>Tue, 16 Jun 2026 09:06:27 +0800</lastBuildDate><atom:link href="https://amatsuzero.github.io/LastStand/tags/%E5%80%BC%E8%AF%AD%E4%B9%89/index.xml" rel="self" type="application/rss+xml"/><item><title>Swift 面试：值语义、COW 与集合源码解析</title><link>https://amatsuzero.github.io/LastStand/posts/swiftinterviewsourcecode/value-semantics-cow-collections/</link><pubDate>Tue, 16 Jun 2026 09:06:27 +0800</pubDate><guid>https://amatsuzero.github.io/LastStand/posts/swiftinterviewsourcecode/value-semantics-cow-collections/</guid><description>&lt;h1 id="swift-面试值语义cow-与集合源码解析"&gt;Swift 面试：值语义、COW 与集合源码解析&lt;/h1&gt;
&lt;p&gt;Swift 的 &lt;code&gt;Array&lt;/code&gt;、&lt;code&gt;String&lt;/code&gt;、&lt;code&gt;Dictionary&lt;/code&gt; 都表现为值类型，但它们不可能每次赋值都完整复制底层存储。面试官问值语义和 COW，真正想看的是你能不能说清楚：&lt;strong&gt;值语义是语言语义，COW 是性能实现；集合表面是 struct，底层经常共享引用存储；写入前靠唯一性检查决定是否复制。&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;这篇文章从面试题出发，把结论落到 Swift 标准库源码里的 Array buffer、String guts、Dictionary storage 和 &lt;code&gt;isKnownUniquelyReferenced&lt;/code&gt;。&lt;/p&gt;
&lt;h2 id="面试高频问题"&gt;面试高频问题&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;Swift 的 struct 为什么常说是值语义？&lt;/li&gt;
&lt;li&gt;Array 赋值时一定会复制底层元素吗？&lt;/li&gt;
&lt;li&gt;Copy-on-Write 的触发条件是什么？&lt;/li&gt;
&lt;li&gt;&lt;code&gt;isKnownUniquelyReferenced&lt;/code&gt; 检查的到底是什么？&lt;/li&gt;
&lt;li&gt;Array、ContiguousArray、ArrayBuffer、Storage 是什么关系？&lt;/li&gt;
&lt;li&gt;String 为什么不能用整数下标随机访问？&lt;/li&gt;
&lt;li&gt;String.Index 为什么不是一个简单的 Int？&lt;/li&gt;
&lt;li&gt;Dictionary 也是 COW 吗？&lt;/li&gt;
&lt;li&gt;ArraySlice 为什么可能持有原数组存储？&lt;/li&gt;
&lt;li&gt;值类型里包含 class 引用，还算值语义吗？&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="30-秒回答版"&gt;30 秒回答版&lt;/h2&gt;
&lt;p&gt;Swift 的值语义是说：从语言使用者角度看，赋值、传参、修改不会意外影响另一个值。但这不等于底层每次都立即复制。&lt;/p&gt;
&lt;p&gt;标准库集合通常用 Copy-on-Write 实现：多个值可以共享同一份堆上 buffer；只有当某个值要写入时，才检查底层 buffer 是否唯一引用。如果唯一，就原地修改；如果不唯一，就复制一份新 buffer 再修改。&lt;/p&gt;
&lt;p&gt;所以：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-text" data-lang="text"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;值语义：用户看到的是独立值
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;COW：实现上先共享，写入前再判断是否复制
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;ARC：维护底层 buffer 的引用计数
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;isUnique：让 COW 判断能否原地修改
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;面试可以这样回答：&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Swift 的 Array 是 struct，但它内部持有引用语义的 storage。赋值时通常只复制结构体里的引用；真正写入时通过唯一性检查决定是否复制底层 storage。这让 Array 同时具备值语义和接近引用共享的性能。&lt;/p&gt;</description></item></channel></rss>