溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶服務(wù)條款》

Go語(yǔ)言是否有必要內(nèi)存對(duì)齊

發(fā)布時(shí)間:2021-08-30 14:59:22 來(lái)源:億速云 閱讀:125 作者:chen 欄目:數(shù)據(jù)庫(kù)

這篇文章主要講解了“Go語(yǔ)言是否有必要內(nèi)存對(duì)齊”,文中的講解內(nèi)容簡(jiǎn)單清晰,易于學(xué)習(xí)與理解,下面請(qǐng)大家跟著小編的思路慢慢深入,一起來(lái)研究和學(xué)習(xí)“Go語(yǔ)言是否有必要內(nèi)存對(duì)齊”吧!

有些同學(xué)可能不知道,struct 中的字段順序不同,內(nèi)存占用也有可能會(huì)相差很大。比如:

type T1 struct {  a int8  b int64  c int16 } type T2 struct {  a int8  c int16  b int64 }

在 64 bit 平臺(tái)上,T1 占用 24 bytes,T2 占用 16 bytes 大小;而在 32 bit 平臺(tái)上,T1 占用 16 bytes,T2 占用 12 bytes 大小。可見(jiàn)不同的字段順序,最終決定 struct 的內(nèi)存大小,所以有時(shí)候合理的字段順序可以減少內(nèi)存的開(kāi)銷。

這是為什么呢?因?yàn)橛袃?nèi)存對(duì)齊的存在,編譯器使用了內(nèi)存對(duì)齊,那么最后的大小結(jié)果就會(huì)不一樣。至于為什么要做對(duì)齊,主要考慮下面兩個(gè)原因:

平臺(tái)(移植性)

不是所有的硬件平臺(tái)都能夠訪問(wèn)任意地址上的任意數(shù)據(jù)。例如:特定的硬件平臺(tái)只允許在特定地址獲取特定類型的數(shù)據(jù),否則會(huì)導(dǎo)致異常情況

性能

若訪問(wèn)未對(duì)齊的內(nèi)存,將會(huì)導(dǎo)致 CPU 進(jìn)行兩次內(nèi)存訪問(wèn),并且要花費(fèi)額外的時(shí)鐘周期來(lái)處理對(duì)齊及運(yùn)算。而本身就對(duì)齊的內(nèi)存僅需要一次訪問(wèn)就可以完成讀取動(dòng)作,這顯然高效很多,是標(biāo)準(zhǔn)的空間換時(shí)間做法

有的小伙伴可能會(huì)認(rèn)為內(nèi)存讀取,就是一個(gè)簡(jiǎn)單的字節(jié)數(shù)組擺放。但實(shí)際上 CPU 并不會(huì)以一個(gè)一個(gè)字節(jié)去讀取和寫(xiě)入內(nèi)存,相反 CPU 讀取內(nèi)存是一塊一塊讀取的,塊的大小可以為 2、4、6、8、16 字節(jié)等大小,塊大小我們稱其為內(nèi)存訪問(wèn)粒度。假設(shè)訪問(wèn)粒度為 4,那么 CPU 就會(huì)以每 4 個(gè)字節(jié)大小的訪問(wèn)粒度去讀取和寫(xiě)入內(nèi)存。

在不同平臺(tái)上的編譯器都有自己默認(rèn)的 “對(duì)齊系數(shù)”。一般來(lái)講,我們常用的 x86 平臺(tái)的系數(shù)為 4;x8664 平臺(tái)系數(shù)為 8。需要注意的是,除了這個(gè)默認(rèn)的對(duì)齊系數(shù)外,還有不同數(shù)據(jù)類型的對(duì)齊系數(shù)。數(shù)據(jù)類型的對(duì)齊系數(shù)在不同平臺(tái)上可能會(huì)不一致。例如,在 x8664 平臺(tái)上,int64 的對(duì)齊系數(shù)為 8,而在 x86 平臺(tái)上其對(duì)齊系數(shù)就是 4。

還是拿上面的 T1、T2 來(lái)說(shuō),在 x86_64 平臺(tái)上,T1 的內(nèi)存布局為:

T2 的內(nèi)存布局為(int16 的對(duì)齊系數(shù)為 2):

仔細(xì)看,T1 存在許多 padding,顯然它占據(jù)了不少空間。那么也就不難理解,為什么調(diào)整結(jié)構(gòu)體內(nèi)成員變量的字段順序就能達(dá)到縮小結(jié)構(gòu)體占用大小的疑問(wèn)了,是因?yàn)榍擅畹販p少了 padding 的存在。讓它們更 “緊湊” 了。

其實(shí)內(nèi)存對(duì)齊除了可以降低內(nèi)存占用之外,還有一種情況是必須要手動(dòng)對(duì)齊的:在 x86 平臺(tái)上原子操作 64bit 指針。之所以要強(qiáng)制對(duì)齊,是因?yàn)樵?32bit 平臺(tái)下進(jìn)行 64bit 原子操作要求必須 8 字節(jié)對(duì)齊,否則程序會(huì) panic。

感謝各位的閱讀,以上就是“Go語(yǔ)言是否有必要內(nèi)存對(duì)齊”的內(nèi)容了,經(jīng)過(guò)本文的學(xué)習(xí)后,相信大家對(duì)Go語(yǔ)言是否有必要內(nèi)存對(duì)齊這一問(wèn)題有了更深刻的體會(huì),具體使用情況還需要大家實(shí)踐驗(yàn)證。這里是億速云,小編將為大家推送更多相關(guān)知識(shí)點(diǎn)的文章,歡迎關(guān)注!

向AI問(wèn)一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI