golang内存对齐
生活随笔
收集整理的這篇文章主要介紹了
golang内存对齐
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
內存對齊的作用
性能問題
一般程序員會認為內存如下圖所示,是有一個個的字節組成,而CPU卻不是這樣看待的。
CPU把內存當作一塊一塊的,塊的大小可以是2、4、8、16字節大小,因此CPU讀取內存是一塊一塊讀取的。(塊的大小稱為內存讀取粒度)
假設CPU要讀取一個int型4字節大小的數據,分兩種情況討論:
當數據從0字節開始時,CPU只需要讀取一次內存即可取到數據。
當數據從1字節開始時,CPU讀取數據就變得復雜了,因為數據沒有在一個塊內存儲。這種情況下,CPU先訪問內存讀取0-3字節數據,在訪問內存讀取4-7字節數據,然后把0、5、6、7字節的數據去掉,合并1、2、3、4字節數據。這樣的操作顯然是浪費了很多性能,所以就有了字節對齊,以空間換時間。
內存對齊規則
默認對齊長度:編譯器會有一個默認對齊長度,golang 中 64 為系統默認的對齊長度是 8 (這個默認值規則具體不清楚,后面再來補充)
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内存对齐的全部內容,希望文章能夠幫你解決所遇到的問題。