這篇文章主要講解了“Go語言是否有必要內(nèi)存對(duì)齊”,文中的講解內(nèi)容簡單清晰,易于學(xué)習(xí)與理解,下面請大家跟著小編的思路慢慢深入,一起來研究和學(xué)習(xí)“Go語言是否有必要內(nèi)存對(duì)齊”吧!
創(chuàng)新互聯(lián)提供做網(wǎng)站、成都網(wǎng)站制作、網(wǎng)頁設(shè)計(jì),品牌網(wǎng)站制作,一元廣告等致力于企業(yè)網(wǎng)站建設(shè)與公司網(wǎng)站制作,十載的網(wǎng)站開發(fā)和建站經(jīng)驗(yàn),助力企業(yè)信息化建設(shè),成功案例突破超過千家,是您實(shí)現(xiàn)網(wǎng)站建設(shè)的好選擇.有些同學(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 大小。可見不同的字段順序,最終決定 struct 的內(nèi)存大小,所以有時(shí)候合理的字段順序可以減少內(nèi)存的開銷。
這是為什么呢?因?yàn)橛袃?nèi)存對(duì)齊的存在,編譯器使用了內(nèi)存對(duì)齊,那么最后的大小結(jié)果就會(huì)不一樣。至于為什么要做對(duì)齊,主要考慮下面兩個(gè)原因:
平臺(tái)(移植性)
不是所有的硬件平臺(tái)都能夠訪問任意地址上的任意數(shù)據(jù)。例如:特定的硬件平臺(tái)只允許在特定地址獲取特定類型的數(shù)據(jù),否則會(huì)導(dǎo)致異常情況
性能
若訪問未對(duì)齊的內(nèi)存,將會(huì)導(dǎo)致 CPU 進(jìn)行兩次內(nèi)存訪問,并且要花費(fèi)額外的時(shí)鐘周期來處理對(duì)齊及運(yùn)算。而本身就對(duì)齊的內(nèi)存僅需要一次訪問就可以完成讀取動(dòng)作,這顯然高效很多,是標(biāo)準(zhǔn)的空間換時(shí)間做法
有的小伙伴可能會(huì)認(rèn)為內(nèi)存讀取,就是一個(gè)簡單的字節(jié)數(shù)組擺放。但實(shí)際上 CPU 并不會(huì)以一個(gè)一個(gè)字節(jié)去讀取和寫入內(nèi)存,相反 CPU 讀取內(nèi)存是一塊一塊讀取的,塊的大小可以為 2、4、6、8、16 字節(jié)等大小,塊大小我們稱其為內(nèi)存訪問粒度。假設(shè)訪問粒度為 4,那么 CPU 就會(huì)以每 4 個(gè)字節(jié)大小的訪問粒度去讀取和寫入內(nèi)存。
在不同平臺(tái)上的編譯器都有自己默認(rèn)的 “對(duì)齊系數(shù)”。一般來講,我們常用的 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 來說,在 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)體占用大小的疑問了,是因?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語言是否有必要內(nèi)存對(duì)齊”的內(nèi)容了,經(jīng)過本文的學(xué)習(xí)后,相信大家對(duì)Go語言是否有必要內(nèi)存對(duì)齊這一問題有了更深刻的體會(huì),具體使用情況還需要大家實(shí)踐驗(yàn)證。這里是創(chuàng)新互聯(lián)網(wǎng)站建設(shè)公司,,小編將為大家推送更多相關(guān)知識(shí)點(diǎn)的文章,歡迎關(guān)注!