golang不安全指針

結構體的成員變量在內存存儲上是一段連續的內存

  • 結構體的初始地址就是第一個成員變量的內存地址
  • 基於結構體的成員地址去計算偏移量。就能夠得出其他成員變量的內存地址

unsafe.Pointer是一個指針類型

  1. 值不能被取消引用?
  2. 如果unsafe.Pointer變量仍然有效,則由unsafe.Pointer變量表示的地址處的數據不會被GC回收
  3. 實質是int類型
  4. 不可以參與指針運算

 

uintptr是一個整數類型

  1. 即使uintptr變量仍然有效,由uintptr變量表示的地址處的數據也可能被GC回收
  2. uintptr 是 Go 的內置類型,返回無符號整數
  3. 可存儲一個完整的地址。後續常用於指針運算
  4. C語言中有一個uintptr_t類型不同位數處理器對應不同定義,用於存放地址
  5. 可以參與指針運算
  6. 將uintptr轉爲unsafe.Pointer指針可能會破壞類型系統,因爲並不是所有的數字都是有效的內存地址

unsafe.Offsetof

  1. 返回變量的字節大小,也就是本文用到的偏移量大小

指針對性能的負面影響

  1. 解引用消耗
  2. 垃圾回收

指針運算

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

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章