编译器只为两者创建一个存储"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
论据。