日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

golang内存对齐

發布時間:2025/6/15 编程问答 16 豆豆
生活随笔 收集整理的這篇文章主要介紹了 golang内存对齐 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

內存對齊的作用

  • 平臺原因(移植):不是所有的硬件平臺都可以訪問任意位置上的任意數據的,有些硬件只能在特定位置取特定數據。
  • 性能問題:經過內存對齊,CPU的內存訪問速度會提升。因為對齊的元素只需要一次內存訪問,未對齊的需要兩次。
  • 性能問題

    一般程序員會認為內存如下圖所示,是有一個個的字節組成,而CPU卻不是這樣看待的。

    CPU把內存當作一塊一塊的,塊的大小可以是2、4、8、16字節大小,因此CPU讀取內存是一塊一塊讀取的。(塊的大小稱為內存讀取粒度)

    假設CPU要讀取一個int型4字節大小的數據,分兩種情況討論:

  • 數據從0字節開始
  • 數據從1字節開始 假設內存讀取粒度為4:
  • 當數據從0字節開始時,CPU只需要讀取一次內存即可取到數據。
    當數據從1字節開始時,CPU讀取數據就變得復雜了,因為數據沒有在一個塊內存儲。這種情況下,CPU先訪問內存讀取0-3字節數據,在訪問內存讀取4-7字節數據,然后把0、5、6、7字節的數據去掉,合并1、2、3、4字節數據。這樣的操作顯然是浪費了很多性能,所以就有了字節對齊,以空間換時間。

    內存對齊規則

    默認對齊長度:編譯器會有一個默認對齊長度,golang 中 64 為系統默認的對齊長度是 8 (這個默認值規則具體不清楚,后面再來補充)

  • 對于結構的各個成員,第一個成員位于偏移為0的位置,以后每個數據成員的起始位置必須是默認對齊長度和該數據成員長度中最小的長度的倍數。
  • 除了結構成員需要對齊,結構本身也需要對齊,結構的長度必須是編譯器默認的對齊長度和成員中最長類型中最小的數據大小的倍數對齊。
  • GO類型對齊

    package main import ( "fmt" "reflect" ) type Data struct { b byte a int32 x int64 } type Data1 struct { b byte x int64 a int32 } func main() { var d Data t := reflect.TypeOf(d) fmt.Println(t.Size(),t.Align()) var d1 Data t1 := reflect.TypeOf(d1) fmt.Println(t1.Size(),t1.Align()) } ---------- 輸出結果: 16 8 24 8

    上面的內存結構如下所示:

    d 的內存結構:

    b---|aaaa|xxxx|xxxx d1的內存結構: b---|----|xxxx|xxxx|aaaa|----

    C 語言對齊規則和 golang 一致,C 語言的默認對齊大小由編譯器決定,我們也可以通過以下代碼修改默認對齊大小。

    pragma pack(2) // 修改默認對齊大小為 2

    總結

    以上是生活随笔為你收集整理的golang内存对齐的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。