微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

Swift,给两个变量赋值同一个值类型实例时,是否只有数组类型对应的变量有相同的内存地址?

如何解决Swift,给两个变量赋值同一个值类型实例时,是否只有数组类型对应的变量有相同的内存地址?

我读到 Swift 值类型使用复制写入优化 OptimizationTips 文档

Swift 中的所有标准库容器都是使用 COW(写时复制)来执行复制而不是显式复制的值类型。在许多情况下,这允许编译器通过保留容器而不是执行深度复制来消除不必要的副本。

为了检查它,我将 [1,2,3] 分配给 a 变量并再次将 a 分配给 b。我使用自定义函数打印了每个变量的内存地址。 最后我发现他们的地址是完全一样的,除非我改变价值 b.append(4)

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

//same memory address
var a = [1,3]
var b = a
address(of: &a) //0x600002b74c20
address(of: &b) //0x600002b74c20

b.append(2)
address(of: &a) //0x600002b74c20
address(of: &b) //0x600001d509d0

在这个实验之后,我在字典、集合和字符串上尝试了同样的方法。这时我发现了一些奇怪的地方,因为虽然我分配了相同的实例,但每个变量的内存地址都是不同的。

//string,dic,set
var c = "1b"
var d = c
address(of: &c) //0x10eaec670
address(of: &d) //0x10eaec680

var e = ["hi" : 3,"bye" : 3]
var f = e
address(of: &e) //0x10eaec690
address(of: &f) //0x10eaec698

var g: Set = [1,2]
var h = g
address(of: &g) //0x10eaec6a0
address(of: &h) //0x10eaec6a8

Array 是一种集合,所以我希望其他集合也能以同样的方式工作。但只有数组变量具有相同的内存地址。我不知道为什么。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。