什么是內(nèi)存對(duì)齊 內(nèi)存對(duì)齊的目的和規(guī)則?
內(nèi)存對(duì)齊的目的和規(guī)則?有四種內(nèi)存對(duì)齊原則:1)。數(shù)據(jù)成員對(duì)齊規(guī)則:結(jié)構(gòu)(或聯(lián)合)的數(shù)據(jù)成員。第一個(gè)數(shù)據(jù)成員放置在偏移量為0的位置。之后,每個(gè)數(shù)據(jù)成員存儲(chǔ)的起始位置從該成員大小或其子成員大小的整數(shù)倍開始
內(nèi)存對(duì)齊的目的和規(guī)則?
有四種內(nèi)存對(duì)齊原則:
1)。數(shù)據(jù)成員對(duì)齊規(guī)則:結(jié)構(gòu)(或聯(lián)合)的數(shù)據(jù)成員。第一個(gè)數(shù)據(jù)成員放置在偏移量為0的位置。之后,每個(gè)數(shù)據(jù)成員存儲(chǔ)的起始位置從該成員大小或其子成員大小的整數(shù)倍開始(只要該成員有子成員,如數(shù)組、結(jié)構(gòu)等)(例如,在32位計(jì)算機(jī)中int為4字節(jié),則應(yīng)從4的整數(shù)倍地址開始存儲(chǔ))?;绢愋筒话╯truct/class/Uinon。
2) . struct as member:如果一個(gè)結(jié)構(gòu)中有一些結(jié)構(gòu)成員,那么應(yīng)該從結(jié)構(gòu)中“最寬的基本類型成員”的整數(shù)倍地址存儲(chǔ)結(jié)構(gòu)成員。(結(jié)構(gòu)a包含結(jié)構(gòu)B,而B包含char、int、double和其他元素,那么B應(yīng)該從8的整數(shù)倍存儲(chǔ)。)。
3) . 收尾工作:結(jié)構(gòu)的總尺寸,即sizeof的結(jié)果,必須是結(jié)構(gòu)內(nèi)部最大構(gòu)件的“最寬基本型構(gòu)件”的整數(shù)倍。彌補(bǔ)不足。(基本類型不包括struct/class/Uinon)。
4) . sizeof(Union),結(jié)構(gòu)中最大的元素是Union的大小,因?yàn)樵谔囟〞r(shí)間,只有Union的一個(gè)成員實(shí)際存儲(chǔ)在地址中。
內(nèi)存對(duì)齊的規(guī)則?
為了加快計(jì)算機(jī)的訪問速度,編譯器在默認(rèn)情況下對(duì)內(nèi)存進(jìn)行字節(jié)對(duì)齊。結(jié)構(gòu)(包括類)字節(jié)對(duì)齊的原則如下:
1)結(jié)構(gòu)變量的第一個(gè)地址可以除以其最寬的基本類型成員的大?。?/p>
2)結(jié)構(gòu)的每個(gè)成員相對(duì)于結(jié)構(gòu)的第一個(gè)地址的偏移量是成員大小的整數(shù)倍。如果需要,編譯器將在成員之間添加內(nèi)部加法;
3)結(jié)構(gòu)的總大小是結(jié)構(gòu)最寬基本類型成員大小的整數(shù)倍。如果需要,編譯器將在最后一個(gè)成員之后添加尾隨填充。Structsbyte1{double//offset 0~7charj//offset 8inta//offset 12~15,因?yàn)?不能被4除,所以填寫9~11}sizeof(sbyte1)//=16structsbyte2{charj//offset 0double//offset 8~15,因?yàn)?不能被8除,所以填寫1~7inta//offset 16~19}sizeof(sbyte2)//=24,為了得到8的倍數(shù),請(qǐng)?zhí)顚?0~23
1對(duì)于32位處理器,也就是說,CPU一次從內(nèi)存中讀取4字節(jié)的數(shù)據(jù)。2邊對(duì)齊意味著對(duì)于存儲(chǔ)一定長(zhǎng)度的M字節(jié)數(shù)據(jù),存儲(chǔ)地址應(yīng)該是M字節(jié)的整數(shù)倍,結(jié)構(gòu)的總體大小是最大成員長(zhǎng)度的整數(shù)倍。