結構體的成員變量在內存存儲上是一段連續的內存
- 結構體的初始地址就是第一個成員變量的內存地址
- 基於結構體的成員地址去計算偏移量。就能夠得出其他成員變量的內存地址
unsafe.Pointer是一個指針類型
- 值不能被取消引用?
- 如果unsafe.Pointer變量仍然有效,則由unsafe.Pointer變量表示的地址處的數據不會被GC回收
- 實質是int類型
- 不可以參與指針運算
uintptr是一個整數類型
- 即使uintptr變量仍然有效,由uintptr變量表示的地址處的數據也可能被GC回收
- uintptr 是 Go 的內置類型,返回無符號整數
- 可存儲一個完整的地址。後續常用於指針運算
- C語言中有一個uintptr_t類型不同位數處理器對應不同定義,用於存放地址
- 可以參與指針運算
- 將uintptr轉爲unsafe.Pointer指針可能會破壞類型系統,因爲並不是所有的數字都是有效的內存地址
unsafe.Offsetof
- 返回變量的字節大小,也就是本文用到的偏移量大小
指針對性能的負面影響
- 解引用消耗
- 垃圾回收
指針運算
var arr [2]int64
arr = [2]int64{
4, 44,
}
p := uintptr(unsafe.Pointer(&arr))
pp := (*int64)(unsafe.Pointer(p + 8))//這一行執行的時候p執行的地址已經被移動
*pp = 66
for _, v := range arr {
println(v)
}
參考資料:
http://www.voidcn.com/article/p-uatezdti-boe.html