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

有些同學(xué)可能不知道,struct 中的字段順序不同,內(nèi)存占用也有可能會相差很大。比如:
type T1 struct { a int8 b int64 c int16 } type T2 struct { a int8 c int16 b int64 }
在 64 bit 平臺上,T1 占用 24 bytes,T2 占用 16 bytes 大小;而在 32 bit 平臺上,T1 占用 16 bytes,T2 占用 12 bytes 大小。可見不同的字段順序,最終決定 struct 的內(nèi)存大小,所以有時(shí)候合理的字段順序可以減少內(nèi)存的開銷。
這是為什么呢?因?yàn)橛袃?nèi)存對齊的存在,編譯器使用了內(nèi)存對齊,那么最后的大小結(jié)果就會不一樣。至于為什么要做對齊,主要考慮下面兩個(gè)原因:
平臺(移植性)
不是所有的硬件平臺都能夠訪問任意地址上的任意數(shù)據(jù)。例如:特定的硬件平臺只允許在特定地址獲取特定類型的數(shù)據(jù),否則會導(dǎo)致異常情況
性能
若訪問未對齊的內(nèi)存,將會導(dǎo)致 CPU 進(jìn)行兩次內(nèi)存訪問,并且要花費(fèi)額外的時(shí)鐘周期來處理對齊及運(yùn)算。而本身就對齊的內(nèi)存僅需要一次訪問就可以完成讀取動作,這顯然高效很多,是標(biāo)準(zhǔn)的空間換時(shí)間做法
有的小伙伴可能會認(rèn)為內(nèi)存讀取,就是一個(gè)簡單的字節(jié)數(shù)組擺放。但實(shí)際上 CPU 并不會以一個(gè)一個(gè)字節(jié)去讀取和寫入內(nèi)存,相反 CPU 讀取內(nèi)存是一塊一塊讀取的,塊的大小可以為 2、4、6、8、16 字節(jié)等大小,塊大小我們稱其為內(nèi)存訪問粒度。假設(shè)訪問粒度為 4,那么 CPU 就會以每 4 個(gè)字節(jié)大小的訪問粒度去讀取和寫入內(nèi)存。
在不同平臺上的編譯器都有自己默認(rèn)的 “對齊系數(shù)”。一般來講,我們常用的 x86 平臺的系數(shù)為 4;x8664 平臺系數(shù)為 8。需要注意的是,除了這個(gè)默認(rèn)的對齊系數(shù)外,還有不同數(shù)據(jù)類型的對齊系數(shù)。數(shù)據(jù)類型的對齊系數(shù)在不同平臺上可能會不一致。例如,在 x8664 平臺上,int64 的對齊系數(shù)為 8,而在 x86 平臺上其對齊系數(shù)就是 4。
還是拿上面的 T1、T2 來說,在 x86_64 平臺上,T1 的內(nèi)存布局為:
T2 的內(nèi)存布局為(int16 的對齊系數(shù)為 2):
仔細(xì)看,T1 存在許多 padding,顯然它占據(jù)了不少空間。那么也就不難理解,為什么調(diào)整結(jié)構(gòu)體內(nèi)成員變量的字段順序就能達(dá)到縮小結(jié)構(gòu)體占用大小的疑問了,是因?yàn)榍擅畹販p少了 padding 的存在。讓它們更 “緊湊” 了。
其實(shí)內(nèi)存對齊除了可以降低內(nèi)存占用之外,還有一種情況是必須要手動對齊的:在 x86 平臺上原子操作 64bit 指針。之所以要強(qiáng)制對齊,是因?yàn)樵?32bit 平臺下進(jìn)行 64bit 原子操作要求必須 8 字節(jié)對齊,否則程序會 panic。
感謝各位的閱讀,以上就是“Go語言是否有必要內(nèi)存對齊”的內(nèi)容了,經(jīng)過本文的學(xué)習(xí)后,相信大家對Go語言是否有必要內(nèi)存對齊這一問題有了更深刻的體會,具體使用情況還需要大家實(shí)踐驗(yàn)證。這里是創(chuàng)新互聯(lián)網(wǎng)站建設(shè)公司,,小編將為大家推送更多相關(guān)知識點(diǎn)的文章,歡迎關(guān)注!
當(dāng)前題目:Go語言是否有必要內(nèi)存對齊-創(chuàng)新互聯(lián)
瀏覽地址:http://www.chinadenli.net/article26/djdocg.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供虛擬主機(jī)、商城網(wǎng)站、App開發(fā)、云服務(wù)器、全網(wǎng)營銷推廣、網(wǎng)站營銷
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來源: 創(chuàng)新互聯(lián)
猜你還喜歡下面的內(nèi)容