如何在 Swift 中证明 String 类型的“写时复制”

2024-05-12

正如标题所说,我试图证明自己,Swift 中的 String 支持 COW(copy on write)。但我找不到证据。在尝试以下代码后,我在数组和字典上证明了 COW:

func address(of object: UnsafeRawPointer) -> String {
    let addr = Int(bitPattern: object)
    return String(format: "%p", addr)
}

var xArray = [20, 30, 40, 50, 60]
var yArray = xArray

// These two addresses were the same
address(of: xArray) 
address(of: yArray)

yArray[0] = 200
// The address of yArray got changed
address(of: yArray)

但对于 String 类型,它不起作用。

var xString = "Hello World"
var yString = xString

// These two addresses were different
address(of: xString)
address(of: yString)

我从官方 Swift 代码仓库中转储了测试函数。

func _rawIdentifier(s: String) -> (UInt, UInt) {
    let tripe = unsafeBitCast(s, to: (UInt, UInt, UInt).self)
    let minusCount = (tripe.0, tripe.2)
    return minusCount
}

但这个函数似乎只转换指向的实际值而不是地址。因此,两个具有相同值的不同字符串变量将具有相同的 rawIdentifier。仍然无法向我证明 COW。

var xString = "Hello World"
var yString = "Hello" + " World" 

// These two rawIdentifiers were the same
_rawIdentifier(s: xString)
_rawIdentifier(s: yString)

那么 COW 在 Swift 中如何处理 String 类型呢?


编译器只为两者创建一个存储"Hello World" and "Hello" + " World".

您可以通过检查汇编代码来验证这一点 从...获取



swiftc -emit-assembly cow.swift
  

它只定义了一个字符串文字



    .section    __TEXT,__cstring,cstring_literals
L___unnamed_1:
    .asciz  "Hello World"
  

一旦字符串发生变化,字符串存储的地址就会改变 缓冲区(该“神奇”元组的第一个成员,实际上_baseAddress of struct _StringCore,定义于StringCore.swift https://github.com/apple/swift/blob/master/stdlib/public/core/StringCore.swift) 变化:

var xString = "Hello World"
var yString = "Hello" + " World"

print(_rawIdentifier(s: xString)) // (4300325536, 0)
print(_rawIdentifier(s: yString)) // (4300325536, 0)

yString.append("!")
print(_rawIdentifier(s: yString)) // (4322384560, 4322384528)

为什么你的

func address(of object: UnsafeRawPointer) -> String

函数显示相同的值xArray and yArray, 但 不是为了xString and yString?

通过一个array向采用不安全指针的函数传递 第一个数组元素的地址,两者相同 数组(如果它们共享存储)。

通过一个string向采用不安全指针的函数传递一个 指向一个的指针暂时的字符串的 UTF-8 表示形式。 即使对于相同的字符串,该地址在每次调用中也可以不同。

此行为记录在“Using Swift with Cocoa and Objective-C”参考UnsafePointer<T>争论,但显然 对于以下情况同样适用UnsafeRawPointer论据。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何在 Swift 中证明 String 类型的“写时复制” 的相关文章

  • 在 strings.xml 中使用 Unicode 字符

    我想在字符串中使用以下 unicode 字符 我通过以下方式找到了它的十六进制和十进制代码this http apps timwhitlock info unicode inspect s F0 9F 9A 95 虽然我知道如何在字符串中使
  • 将数据追加到 UITableView 的正确方法,swift

    我正在尝试使用两种方式将新数据添加到 UITableView 第一种方式 func insertData appendMessages Message var currentCount self messeges count var ind
  • xcode 9 中的 Facebook 登录按钮终止

    我正在使用 Xcode 9 并将编译器设置为 Swift 3 2 我使用 Cocoapods 安装了 Facebook Login 一切都编译没有任何错误 但每当我在模拟器中运行它时 我单击登录按钮 它就会崩溃 控制台中仅打印以下内容 li
  • 使用按键重新排列字符串

    我想使用Pythonrandomly根据给定的键重新排列字符串的各个部分 我还想用相同的密钥恢复原始字符串 def rearrange key data pass def restore key rearranged data pass 效
  • Javascript 的 toUpperCase() 语言安全吗?

    请问Ja vascript的String原型方法toUpperCase 在每种支持 UTF 8 的语言 字符集中提供自然预期的结果 我尝试过简体中文 韩语 泰米尔语 日语和西里尔语 到目前为止结果似乎是合理的 我可以信赖该方法是语言安全的吗
  • 字符串文字仍然以双斜杠结尾? [复制]

    这个问题在这里已经有答案了 我有一小段代码 public static void Write string filename string time DateTime Now ToString hh mm tt int date int P
  • iOS11视觉框架映射所有人脸特征点

    我正在使用视觉框架并使用以下代码获取所有里程碑点 if let allFaceLandmarks landmarks allPoints print allFaceLandmarks 但无法找到这些点的映射 例如右眼的索引号 寻找相同的东西
  • 在 SwiftUI 文档应用程序中,如何从函数内保存文档

    当前版本的 Xcode 版本 12 5 1 为 macOS 的基于文档的应用程序提供了一个模板 提供以下文档模型 struct MyDocument FileDocument var text String init text String
  • Swift:在标签背景中制作图像

    我想将标签放入带有角半径的红色矩形的图像中 条件是图像大小必须等于或略大于标签大小 为此我找到了一个类似的question https stackoverflow com questions 3037902 adding backgroun
  • 以编程方式设置 UITextField 占位符颜色

    如何在 swift 中以编程方式设置 UITextField 占位符颜色 1 创建一个具有所需颜色的 AttributedString 2 将此 AttributedString 设置为文本字段 attributePlaceholder 属
  • 删除 UISearchBar 中的清除按钮

    我想从 UISearchBar 中删除清除按钮 灰色 x 我尝试按照中的描述进行操作这个答案 https stackoverflow com a 19458201 但它不起作用 我将 Objective C 代码从下面的答案和评论翻译为以下
  • 如何将 ArrayList 中的所有值相加或转换为 ArrayList

    我试图将 ArrayList 中的所有值相加 但没有任何方法可以让我得到总和 我必须找到从文本文件中提取的数字的平均值 public static void main String args throws IOException File
  • 如何禁用 ARCoachingOverlayView 的自动激活?

    我正在添加一个ARCoachingOverlayView to my ARView像这样 let coachingOverlayTemp ARCoachingOverlayView coachingOverlayTemp delegate
  • 判断第一个字母是否是元音序言

    我习惯了过程式编程语言 而且我在 prolog 上遇到了一些困难 缺乏在线资源也是一个遗憾 获取给定变量的第一个字符并检查它是否是元音的最 序言 方式是什么 我想 这样的东西就是我所追求的 这都是伪代码 但这是你解决问题的方法吗 isVow
  • 如何在 flutter 插件的 Swift 编写的 iOS 部分中使用 Objective-C 框架

    In a 颤振插件 我想用一个Objective C我的框架iOS部分用swift编写 然后将其用于使用 Swift 的 Flutter 项目作为 iOS 语言 经过一些研究 我不是 iOS 开发人员 后 我发现我想要做的事情可以通过导入文
  • 使用 Swift 导入 aurioTouch 库

    我正在尝试将 Objective C 应用程序转换为 swift 我想导入课程奥里奥触摸 https developer apple com library ios samplecode aurioTouch Introduction In
  • 如何防止在 macOS 中打开同一窗口的多个实例?

    我正在制作一个 Mac 菜单栏应用程序 它有一个Preferences选项 当用户点击它时 会出现一个Preferences将打开窗口 显示应用程序的所有设置 我打开Preferences窗口如 let storyboard NSStory
  • 在 AT&T x86 程序集中查找转义字符

    问题一 我有以下汇编代码 其目的是循环输入字符串 并计算它遇到的转义字符 的数量 globl sprinter data escape string string num escape long 0 num characters long
  • 在字符串中搜索停用词[关闭]

    Closed 这个问题需要细节或清晰度 help closed questions 目前不接受答案 我正在尝试在字符串 zach 中搜索停用词 THE BE TO OF AND A IN THAT I 它 在 在 但是 是 随着 我不确定字
  • 将字符串编码为 HTML 字符串 Swift 3

    如何快速编码字符串以删除所有特殊字符并将其替换为其匹配的 html 编号 假设我有以下字符串 var mystring This is my String That s it 然后用它的html编号替换特殊字符 38 39 gt 62 但我

随机推荐

  • 如何在 NodeJS 中允许表单数据

    我最近创建了一个接受文件的 API 我正在尝试使用 Postman 测试 API 如果我使用发出帖子请求x wwww form urlencoded身体类型 一切正常 我得到了所有预期的数据 唯一的问题是它不允许发送文件 如果我使用form
  • 关于文件 file = new File(路径)

    The Java iO 文件 http docs oracle com javase 6 docs api java io File html File 28java lang String 29文档说了以下关于其构造函数的内容 该构造函数
  • xml 拉解析器资产 xml

    如何使用拉解析器解析资产文件夹中的本地 XML 文件 我无法让拉解析器工作 它总是抛出 io 异常 我想我无法获取文件的路径或连接到该文件 mixm 我正在尝试各种方法来从 资产 和 资源 加载本地文件 但要按要求回答您的问题 因为其他人似
  • 在 java 8 中找不到 AnnotationProcessorFactory 类

    我有一个项目是建立在java 1 6 and 现在我将java版本升级到1 8 and构建项目 这里我使用 gradle 来构建项目 这是等级代码 task wsgen dependsOn compileJava doLast ant ta
  • asp.net core 1 appsettings.product.json 不更新连接字符串

    我在生产环境中有一个应用程序 使用在 IIS 上运行的 net core RC1 我重新编写了该应用程序 因为该公司希望将其放在 net core1 上 因为那是正式版本 在我的 net core RC1 应用程序中 我有 config j
  • Nodejs:在哪里或如何编写复杂的业务逻辑?

    最近我接触到了node js 和一些很酷的包 比如express 和jade 我一直有几个问题不断地敲我的门 如果我选择 Node js 来构建我的下一个网站 我将使用 JavaScript 来编写服务器端复杂的逻辑 但我不认为你可以将 J
  • 具有灵活数组成员的结构的大小

    Given struct Foo uint32 t a uint32 t b What is sizeof Foo 它是实现定义的行为还是未定义的行为 C 和 C 的答案是否不同 编译器将忽略灵活数组成员 因为它不存在 C11 6 7 2
  • 找不到模块“@angular/platform-b​​rowser/animations”

    我收到错误 ts 找不到模块 angular platform b rowser animations 我已经安装了以下内容 npm install save Angular Material Angular cdk npm install
  • 从 Java 运行 MATLAB 函数

    我在 MATLAB 中有一个 m 文件 我想从 Java 调用该文件 并以字符串或 Java 中的任何形式获取解决方案 这听起来很简单 但由于某种原因我无法让它发挥作用 我试过这个 matlab nosplash wait nodeskto
  • java设置图像的分辨率和打印尺寸

    我编写了一个程序 生成一个 BufferedImage 以显示在屏幕上 然后打印 图像的一部分包括 1 像素宽的网格线 即 一行为1个像素 行与行之间大约有10个像素 由于屏幕分辨率的原因 图像显示得比这大得多 每行有几个像素 我想将其绘制
  • 检索除指定一列之外的所有 DataFrame [重复]

    这个问题在这里已经有答案了 有没有办法选择 pandas DataFrame 对象中除一列之外的所有列 我已经看到了删除列的方法 但我不想这样做 use drop method df drop column name axis 1
  • 同一页面中多个表单上的 Google 隐形 ReCaptcha - PHP

    我正在我的 php 网站上关注这个 Invisible ReCaptcha 文档 http www pinnacleinternet com installing invisible recaptcha http www pinnaclei
  • 如何等待 WebSocket 就绪状态更改

    我正在尝试实现一个可以回退到轮询的 WebSocket 如果WebSocket连接成功 readyState变为1 但如果失败 readyState是 3 我应该开始轮询 我尝试过这样的事情 var socket new WebSocket
  • 如何从 VS2013 为基于 ADO.Net 的存储库编写单元测试代码

    我在单元测试领域很新 那么请指导我如何在控制器内为基于 ADO Net 的存储库和操作方法编写单元测试 我将使用 VS 自己的单元测试框架 所以请看代码并告诉我哪些类和函数需要经过单元测试 如果有人告诉我哪些区域需要单元测试以及哪些区域不需
  • 作为服务主体运行 azure 逻辑应用/连接器

    是否可以将逻辑应用或连接器作为服务主体运行 特别是在消费计划下 我猜想强制应用程序在通过 powershell 的非消费计划 https github com logicappsio ConsumptionToAppServicePlan可
  • 检查多个变量java中的替换空值

    我试图找到一种简单的方法来在 Java 中的多个变量中执行多个 null 检查 替换 我有一个包含大约 20 个字符串变量的对象 在构造函数中 我想检查是否有任何变量值为空 如果它们为空 我想用空字符串替换它们 我可以执行一系列 if 语句
  • 如何在 Visual Studio Code 中编译和运行 Java 代码

    我下载了 Visual Studio Code 并安装了 Java扩展包 https marketplace visualstudio com items itemName vscjava vscode java pack 由微软 之后我下
  • 如何在 C# WinRT/winmd 中调整图像大小?

    我有一个简单的问题 但到目前为止我还没有找到答案 如何在 C WinRT WinMD 项目中调整 jpeg 图像的大小并将其另存为新的 jpeg 我正在开发 Windows 8 Metro 应用程序 用于从某些网站下载每日图像并将其显示在动
  • 对象什么时候有资格进行垃圾收集?

    在下面的代码中 考虑到amethod已被调用 最初引用的对象在什么点 线上myObject 有资格进行垃圾收集吗 class Test private Object classObject public void amethod Objec
  • 如何在 Swift 中证明 String 类型的“写时复制”

    正如标题所说 我试图证明自己 Swift 中的 String 支持 COW copy on write 但我找不到证据 在尝试以下代码后 我在数组和字典上证明了 COW func address of object UnsafeRawPoi