<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
結構體在Go
語言中是一個很重要的部分,在專案中會經常用到,大家在寫Go
時有沒有注意過,一個struct
所佔的空間不一定等於各個欄位加起來的空間之和,甚至有時候把欄位的順序調整一下,struct
的所佔空間不一樣,接下來通過這篇文章來看一下結構體在記憶體中是怎麼分佈的?通過對記憶體佈局的瞭解,可以幫助我們寫出更優質的程式碼。感興趣的小夥伴們可以參考借鑑,希望對大家能有所幫助。
結構體實際上就是由各種型別的資料組合而成的一種符合資料型別,一個結構體變數的大小是由結構體中的欄位決定。結構體和它所包含的資料在記憶體中是以連續塊的形式存在的。我們可以藉助unsafe.Sizeof
方法,來獲取:
package main import ( "fmt" "unsafe" ) type Test struct { T1 int8 // 1 T2 int8 // 1 T3 int8 // 1 } func main() { var t Test fmt.Println(unsafe.Sizeof(t)) //3 bytes }
不同型別的變數佔用記憶體大小是不一樣的,但是cpu每次讀取的記憶體長度是固定的(比如cpu是64位元的,一次可以從記憶體中讀取64位元的資料,即8個位元組),為了cpu能高效的讀寫資料,編譯器會把各種型別的資料放在合適的地址,而不是順序的一個接一個的排放,並佔用合適的長度,這就是記憶體對齊。每種型別的對齊值就是它的對齊邊界。
範例:
package main import ( "fmt" "unsafe" ) type Test struct { a int8 // 1 b int64 // 8 c int32 // 4 } type Test2 struct { a int8 // 1 b int32 // 4 c int64 // 8 } func main() { var t Test fmt.Println(unsafe.Sizeof(t)) // 24 var t2 Test2 fmt.Println(unsafe.Sizeof(t2))// 16 }
通過上面範例,我們可以看到兩個結構體中3個欄位型別相同,當排列順序發生變化時,總的記憶體大小也會發生變化。下面我們來一起分析一下:
如果沒有記憶體對齊,那結構體各個欄位在記憶體中是緊密排列的,如t1記憶體佈局示意圖如下:
因為b這個欄位需要8個位元組,所以會有一個位元組的資料排列到第2個字中。如果程式想要讀取b欄位的資料,那麼CPU需要兩次讀取才能獲取到完整的資料,這樣就會影響了程式的效能。
所以,為了能讓CPU減少一次獲取的時間,Go編譯器會幫你把struct結構體做資料的對齊,以便CPU可以一次將該資料從記憶體中讀取出來。重新排列後記憶體佈局結構示意圖如下:
其中有13個位元組是真正儲存資料的,而灰色的11個位元組則是為了對齊而填充上的,不儲存任何資料,所以才會比沒有對齊排列時多出11個位元組。
雖然通過對齊填充的方式提高了CPU讀寫資料的效率,但是這些填充記憶體確實有點浪費空間,那有沒有辦法既可以既可以做到記憶體對齊保證CPU讀寫效率又能減少浪費記憶體空間呢?
那就是調整struct欄位的順序,我們在來看一下t2結構體的欄位記憶體佈局結構示意圖如下:
這樣重新排列後,只佔了16個位元組,比上面那種方式少了8個位元組。由此可知,對結構體欄位的重新排列會讓結構體更節省內。
本篇文章我們一起學習了Go 語言中的記憶體對齊,主要內容如下:
到此這篇關於一文帶你搞懂Golang結構體記憶體佈局的文章就介紹到這了,更多相關Golang結構體記憶體佈局內容請搜尋it145.com以前的文章或繼續瀏覽下面的相關文章希望大家以後多多支援it145.com!
相關文章
<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
综合看Anker超能充系列的性价比很高,并且与不仅和iPhone12/苹果<em>Mac</em>Book很配,而且适合多设备充电需求的日常使用或差旅场景,不管是安卓还是Switch同样也能用得上它,希望这次分享能给准备购入充电器的小伙伴们有所
2021-06-01 09:31:42
除了L4WUDU与吴亦凡已经多次共事,成为了明面上的厂牌成员,吴亦凡还曾带领20XXCLUB全队参加2020年的一场音乐节,这也是20XXCLUB首次全员合照,王嗣尧Turbo、陈彦希Regi、<em>Mac</em> Ova Seas、林渝植等人全部出场。然而让
2021-06-01 09:31:34
目前应用IPFS的机构:1 谷歌<em>浏览器</em>支持IPFS分布式协议 2 万维网 (历史档案博物馆)数据库 3 火狐<em>浏览器</em>支持 IPFS分布式协议 4 EOS 等数字货币数据存储 5 美国国会图书馆,历史资料永久保存在 IPFS 6 加
2021-06-01 09:31:24
开拓者的车机是兼容苹果和<em>安卓</em>,虽然我不怎么用,但确实兼顾了我家人的很多需求:副驾的门板还配有解锁开关,有的时候老婆开车,下车的时候偶尔会忘记解锁,我在副驾驶可以自己开门:第二排设计很好,不仅配置了一个很大的
2021-06-01 09:30:48
不仅是<em>安卓</em>手机,苹果手机的降价力度也是前所未有了,iPhone12也“跳水价”了,发布价是6799元,如今已经跌至5308元,降价幅度超过1400元,最新定价确认了。iPhone12是苹果首款5G手机,同时也是全球首款5nm芯片的智能机,它
2021-06-01 09:30:45