這是我列印出 Array 的記憶體地址的方式,以了解 struct 的寫時復制行為的含義。
結構陣列
func print(address o: UnsafeRawPointer ) {
print(String(format: "%p", Int(bitPattern: o)))
}
var x = [1,2,3]
var y = x
// 0x600002654260
print(address: x)
// 0x600002654260 // x & y pointing to same address.
print(address: y)
x.append(4)
// 0x6000010504d0
print(address: x) // Address changed after mutation, to avoid sharing same copy as y
// 0x600002654260
print(address: y)
x.append(5)
// 0x6000010504d0
print(address: x) // Address remained after mutation
// 0x600002654260
print(address: y)
但是,當我想對 generic 做同樣的研究時Set,以前的方法已經行不通了。
通用結構集
func print(address o: UnsafeRawPointer ) {
print(String(format: "%p", Int(bitPattern: o)))
}
var x : Set = [1,2,3]
var y = x
print(address: x)
print(address: y)
x.insert(4)
print(address: x)
print(address: y)
x.insert(5)
print(address: x)
print(address: y)
呼叫時出現以下錯誤 print
無法將“Set”型別的值轉換為預期的引數型別“UnsafeRawPointer”
我試過了withUnsafePointer。但我懷疑withUnsafePointer沒有給出正確的結果。我期待兩者x,并且y應該指向同一個地址。
var x : Set = [1,2,3]
var y = x
// 0x000000010467c090
withUnsafePointer(to: &x) {
print("\($0)")
}
// 0x000000010467c098
withUnsafePointer(to: &y) {
print("\($0)")
}
為通用結構集列印地址以了解寫時復制行為的含義的正確方法是什么?
uj5u.com熱心網友回復:
首先,請注意,寫時復制的不是 和 的結構實體Array<T>。Set<T>這是他們的后備商店。如果您對陣列和集合具有后備存盤的事實感到困惑,請參閱
通過一兩次x.insert呼叫,將有兩種分配:

轉載請註明出處,本文鏈接:https://www.uj5u.com/qianduan/413443.html
標籤:
