內(nèi)存對(duì)齊

概念

對(duì)齊跟數(shù)據(jù)在內(nèi)存中的位置有關(guān)粒氧。如果一個(gè)變量的內(nèi)存地址正好位于它長(zhǎng)度的整數(shù)倍馍忽,他就被稱做自然對(duì)齊侨嘀。比如在32cpu下型宝,假設(shè)一個(gè)整型變量的地址為0x00000004,那它就是自然對(duì)齊的絮爷。

為什么要字節(jié)對(duì)齊

  • CPU每次尋址都是要消費(fèi)時(shí)間的趴酣,并且CPU訪問(wèn)內(nèi)存時(shí),并不是逐個(gè)字節(jié)訪問(wèn)坑夯,而是以字長(zhǎng)(word size)為單位訪問(wèn)岖寞,所以數(shù)據(jù)結(jié)構(gòu)應(yīng)該盡可能地在自然邊界上對(duì)齊,如果訪問(wèn)未對(duì)齊的內(nèi)存柜蜈,處理器需要做兩次內(nèi)存訪問(wèn)仗谆,而對(duì)齊的內(nèi)存訪問(wèn)僅需要一次訪問(wèn),內(nèi)存對(duì)齊后可以提升性能
  • 有些CPU可以訪問(wèn)任意地址上的任意數(shù)據(jù)淑履,而有些CPU只能在特定地址訪問(wèn)數(shù)據(jù)隶垮,因此不同硬件平臺(tái)具有差異性,這樣的代碼就不具有移植性秘噪,如果在編譯時(shí)狸吞,將分配的內(nèi)存進(jìn)行對(duì)齊,這就具有平臺(tái)可以移植性了

如何進(jìn)行對(duì)齊指煎?

  • 基本數(shù)據(jù)類型:地址只要是它的長(zhǎng)度的整數(shù)倍即可
  • 數(shù)組:按照基本數(shù)據(jù)類型對(duì)齊蹋偏,第一個(gè)對(duì)齊了后面的自然也就對(duì)齊了
  • 聯(lián)合:按其包含的長(zhǎng)度最大的數(shù)據(jù)類型對(duì)齊
  • 結(jié)構(gòu)體:結(jié)構(gòu)體中每個(gè)數(shù)據(jù)類型都要對(duì)齊

對(duì)齊數(shù)

對(duì)齊數(shù) =編譯器默認(rèn)值成員自身大小 兩者的較小值
32位cpu上默認(rèn)的指定對(duì)齊值是4字節(jié),64位cpu上默認(rèn)的指定對(duì)齊值是8字節(jié)

對(duì)齊規(guī)則

  1. 第一個(gè)成員一定對(duì)齊,位于結(jié)構(gòu)體變量偏移量(offset)為0的地址處至壤。
  2. 其他成員要對(duì)齊到對(duì)齊數(shù)的整數(shù)倍的地址處(當(dāng)前起始偏移量 % min(成員大小威始, 對(duì)齊數(shù)) == 0)
  3. 結(jié)構(gòu)體 總大小必須為最大對(duì)齊數(shù)(每個(gè)成員都有一個(gè)對(duì)齊數(shù))的整數(shù)倍。
  4. 如果嵌套了結(jié)構(gòu)體的情況像街,先按規(guī)則計(jì)算出嵌套的結(jié)構(gòu)體大小黎棠,最后結(jié)構(gòu)體的整體大小就是所有最大對(duì)齊數(shù)(含嵌套結(jié)構(gòu)體的對(duì)齊數(shù))的整數(shù)倍晋渺。

舉例(golang)

// 64位平臺(tái),對(duì)齊參數(shù)是8
type User struct {
 A int32 // 4
 B []int32 // 24 葫掉,切片結(jié)構(gòu)體中每個(gè)成員占用8字節(jié)
 C string // 16 些举,字符串結(jié)構(gòu)體類型占用16字節(jié)
 D bool // 1
}

對(duì)齊參數(shù)是8,int32俭厚、[]int32户魏、string、bool對(duì)齊值分別是4挪挤、8叼丑、8、1扛门,占用內(nèi)存大小分別是4鸠信、24、16论寨、1星立,我們先根據(jù)第一條對(duì)齊規(guī)則分析User:

  • 第一個(gè)字段類型是int32,對(duì)齊值是4葬凳,大小為4绰垂,所以放在內(nèi)存布局中的第一位.
  • 第二個(gè)字段類型是[]int32,對(duì)齊值是8火焰,大小為24劲装,按照第一條規(guī)則,偏移量應(yīng)該是成員大小24與對(duì)齊值8中較小那個(gè)的整數(shù)倍昌简,那么偏移量就是8占业,所以4-7位會(huì)由編譯進(jìn)行填充,一般為0值纯赎,也稱為空洞谦疾,第9到32位為第二個(gè)字段B.
  • 第三個(gè)字段類型是string,對(duì)齊值是8犬金,大小為16餐蔬,所以他的內(nèi)存偏移值必須是8的倍數(shù),因?yàn)閡ser前兩個(gè)字段就已經(jīng)排到了第32位佑附,所以offset為32正好是8的倍數(shù)樊诺,不要填充,從32位到48位是第三個(gè)字段C.
  • 第四個(gè)字段類型是bool音同,對(duì)齊值是1词爬,大小為1,所以他的內(nèi)存偏移值必須是1的倍數(shù)权均,因?yàn)閡ser前兩個(gè)字段就已經(jīng)排到了第48位顿膨,所以下一位的偏移量正好是48锅锨,正好是字段D的對(duì)齊值的倍數(shù),不用填充恋沃,可以直接排列到第四個(gè)字段必搞,也就是從48到第49位是第三個(gè)字段D

?著作權(quán)歸作者所有:來(lái)自51CTO博客作者Golang夢(mèng)工廠的原創(chuàng)作品,請(qǐng)聯(lián)系作者獲取轉(zhuǎn)載授權(quán)囊咏,否則將追究法律責(zé)任
詳解內(nèi)存對(duì)齊
https://blog.51cto.com/u_14523732/5707302

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末恕洲,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子梅割,更是在濱河造成了極大的恐慌霜第,老刑警劉巖,帶你破解...
    沈念sama閱讀 217,657評(píng)論 6 505
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件户辞,死亡現(xiàn)場(chǎng)離奇詭異泌类,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī)底燎,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,889評(píng)論 3 394
  • 文/潘曉璐 我一進(jìn)店門刃榨,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人双仍,你說(shuō)我怎么就攤上這事喇澡。” “怎么了殊校?”我有些...
    開(kāi)封第一講書人閱讀 164,057評(píng)論 0 354
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)读存。 經(jīng)常有香客問(wèn)我为流,道長(zhǎng),這世上最難降的妖魔是什么让簿? 我笑而不...
    開(kāi)封第一講書人閱讀 58,509評(píng)論 1 293
  • 正文 為了忘掉前任敬察,我火速辦了婚禮,結(jié)果婚禮上尔当,老公的妹妹穿的比我還像新娘莲祸。我一直安慰自己,他們只是感情好椭迎,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,562評(píng)論 6 392
  • 文/花漫 我一把揭開(kāi)白布锐帜。 她就那樣靜靜地躺著,像睡著了一般畜号。 火紅的嫁衣襯著肌膚如雪缴阎。 梳的紋絲不亂的頭發(fā)上,一...
    開(kāi)封第一講書人閱讀 51,443評(píng)論 1 302
  • 那天简软,我揣著相機(jī)與錄音蛮拔,去河邊找鬼述暂。 笑死,一個(gè)胖子當(dāng)著我的面吹牛建炫,可吹牛的內(nèi)容都是我干的畦韭。 我是一名探鬼主播,決...
    沈念sama閱讀 40,251評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼肛跌,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼艺配!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起惋砂,我...
    開(kāi)封第一講書人閱讀 39,129評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤妒挎,失蹤者是張志新(化名)和其女友劉穎,沒(méi)想到半個(gè)月后西饵,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體酝掩,經(jīng)...
    沈念sama閱讀 45,561評(píng)論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,779評(píng)論 3 335
  • 正文 我和宋清朗相戀三年眷柔,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了期虾。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 39,902評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡驯嘱,死狀恐怖镶苞,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情鞠评,我是刑警寧澤茂蚓,帶...
    沈念sama閱讀 35,621評(píng)論 5 345
  • 正文 年R本政府宣布,位于F島的核電站剃幌,受9級(jí)特大地震影響聋涨,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜负乡,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,220評(píng)論 3 328
  • 文/蒙蒙 一牍白、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧抖棘,春花似錦茂腥、人聲如沸。這莊子的主人今日做“春日...
    開(kāi)封第一講書人閱讀 31,838評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至朝捆,卻和暖如春仑性,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開(kāi)封第一講書人閱讀 32,971評(píng)論 1 269
  • 我被黑心中介騙來(lái)泰國(guó)打工诊杆, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留歼捐,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 48,025評(píng)論 2 370
  • 正文 我出身青樓晨汹,卻偏偏與公主長(zhǎng)得像豹储,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子淘这,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,843評(píng)論 2 354

推薦閱讀更多精彩內(nèi)容

  • 問(wèn)題 在開(kāi)始之前剥扣,希望你計(jì)算一下 Part1 共占用的大小是多少呢? 輸出結(jié)果: 這么一算铝穷,Part1 這一個(gè)結(jié)構(gòu)...
    羋學(xué)僧閱讀 522評(píng)論 3 2
  • unsafe 包簡(jiǎn)單說(shuō)明 unsafe钠怯,顧名思義,是不安全的曙聂,Go定義這個(gè)包名也是這個(gè)意思晦炊,讓我們盡可能的不要使用...
    Gopherzhang閱讀 1,510評(píng)論 8 3
  • 原文地址:在 Go 中恰到好處的內(nèi)存對(duì)齊 問(wèn)題 在開(kāi)始之前,希望你計(jì)算一下 Part1 共占用的大小是多少呢宁脊? 輸...
    EDDYCJY閱讀 1,116評(píng)論 1 11
  • 本次主要討論三個(gè)問(wèn)題: 什么是內(nèi)存對(duì)齊 內(nèi)存對(duì)齊的好處 如何對(duì)齊 內(nèi)存對(duì)齊 內(nèi)存對(duì)齊是一種提高內(nèi)存訪問(wèn)速度的策略断国。...
    一個(gè)人在路上走下去閱讀 1,509評(píng)論 0 2
  • 1. 介紹 CPU把內(nèi)存當(dāng)成是一塊一塊的,塊的大小可以是2榆苞,4稳衬,8,16字節(jié)大小坐漏,因此CPU在讀取內(nèi)存時(shí)是一塊一塊...
    husky_1閱讀 1,129評(píng)論 0 1