這篇文章主要講解了“Go語言是否有必要內(nèi)存對齊”,文中的講解內(nèi)容簡單清晰,易于學(xué)習(xí)與理解,下面請大家跟著小編的思路慢慢深入,一起來研究和學(xué)習(xí)“Go語言是否有必要內(nèi)存對齊”吧!
專注于為中小企業(yè)提供成都做網(wǎng)站、成都網(wǎng)站制作服務(wù),電腦端+手機(jī)端+微信端的三站合一,更高效的管理,為中小企業(yè)沛縣免費(fèi)做網(wǎng)站提供優(yōu)質(zhì)的服務(wù)。我們立足成都,凝聚了一批互聯(lián)網(wǎng)行業(yè)人才,有力地推動(dòng)了千余家企業(yè)的穩(wěn)健成長,幫助中小企業(yè)通過網(wǎng)站建設(shè)實(shí)現(xiàn)規(guī)模擴(kuò)充和轉(zhuǎn)變。
有些同學(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)存對齊的存在,編譯器使用了內(nèi)存對齊,那么最后的大小結(jié)果就會(huì)不一樣。至于為什么要做對齊,主要考慮下面兩個(gè)原因:
平臺(tái)(移植性)
不是所有的硬件平臺(tái)都能夠訪問任意地址上的任意數(shù)據(jù)。例如:特定的硬件平臺(tái)只允許在特定地址獲取特定類型的數(shù)據(jù),否則會(huì)導(dǎo)致異常情況
性能
若訪問未對齊的內(nèi)存,將會(huì)導(dǎo)致 CPU 進(jìn)行兩次內(nèi)存訪問,并且要花費(fèi)額外的時(shí)鐘周期來處理對齊及運(yùn)算。而本身就對齊的內(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)的 “對齊系數(shù)”。一般來講,我們常用的 x86 平臺(tái)的系數(shù)為 4;x8664 平臺(tái)系數(shù)為 8。需要注意的是,除了這個(gè)默認(rèn)的對齊系數(shù)外,還有不同數(shù)據(jù)類型的對齊系數(shù)。數(shù)據(jù)類型的對齊系數(shù)在不同平臺(tái)上可能會(huì)不一致。例如,在 x8664 平臺(tái)上,int64 的對齊系數(shù)為 8,而在 x86 平臺(tái)上其對齊系數(shù)就是 4。
還是拿上面的 T1、T2 來說,在 x86_64 平臺(tái)上,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)存占用之外,還有一種情況是必須要手動(dòng)對齊的:在 x86 平臺(tái)上原子操作 64bit 指針。之所以要強(qiáng)制對齊,是因?yàn)樵?32bit 平臺(tái)下進(jìn)行 64bit 原子操作要求必須 8 字節(jié)對齊,否則程序會(huì) panic。
感謝各位的閱讀,以上就是“Go語言是否有必要內(nèi)存對齊”的內(nèi)容了,經(jīng)過本文的學(xué)習(xí)后,相信大家對Go語言是否有必要內(nèi)存對齊這一問題有了更深刻的體會(huì),具體使用情況還需要大家實(shí)踐驗(yàn)證。這里是創(chuàng)新互聯(lián),小編將為大家推送更多相關(guān)知識(shí)點(diǎn)的文章,歡迎關(guān)注!
文章名稱:Go語言是否有必要內(nèi)存對齊
標(biāo)題網(wǎng)址:http://www.rwnh.cn/article30/gspppo.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供網(wǎng)頁設(shè)計(jì)公司、標(biāo)簽優(yōu)化、外貿(mào)網(wǎng)站建設(shè)、定制網(wǎng)站、營銷型網(wǎng)站建設(shè)、品牌網(wǎng)站建設(shè)
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會(huì)在第一時(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)