全攻略有點(diǎn)大放厥詞,嘩眾取寵了,其實(shí)是一些常見的問題罷了。但是自認(rèn)為總結(jié)的還算全面一點(diǎn)吧,請大家多多賜教,我只是個(gè)初學(xué)者。

接下來主要討論四點(diǎn):
一、不涉及位域的內(nèi)存對齊
二、涉及位域的內(nèi)存對齊
三、成員變量含有結(jié)構(gòu)體的內(nèi)存對齊情況
四、要求內(nèi)存對齊的原因及優(yōu)點(diǎn)

-----------------------------------------------------------------------------------

接著上一篇往下寫~~

二、涉及位域的內(nèi)存對齊
注:由于能力有限,在此僅討論在VC++6.0編譯環(huán)境下的情況,對于其他編譯環(huán)境下的情況,由于沒有硬件支持,只能作罷,但會(huì)將查到的相關(guān)知識(shí)貼在最后,但不做討論。
涉及位域的內(nèi)存對齊原則 如下,后用代碼分析驗(yàn)證:
1) 若相鄰成員變量類型相同,且其位寬之和不大于成員變量類型位寬(在次嚴(yán)重強(qiáng)調(diào),是 類型位寬 而不是成員變量sizeof,也不是類型的sizeof或者其他什么)大小,則后面的字段將緊鄰前一個(gè)字段存儲(chǔ),直到不能容納為止;
2) 如果相鄰位域字段的類型相同,但其位寬之和不大于類型的sizeof大小,則后面的字段將從新的存儲(chǔ)單元開始,其偏移量為其類型大小的整數(shù)倍;
3) 如果相鄰的位域字段的類型不同,不同位域字段存放在不同的位域類型字節(jié)中;(這一條其實(shí)會(huì)根據(jù)編譯器的不同而采用不同的規(guī)則,此處以VC++6.0標(biāo)準(zhǔn)來說明)
4)其實(shí)不存在4),這一條是說,在此,還要遵守不涉及位域的2),3)條規(guī)則,已經(jīng)部分遵守不涉及位域的第一條規(guī)則
實(shí)例分析,代碼如下:

 1#include <iostream>
 2using namespace std;
 3struct A
 4
 5    char c1:4
 6    char c2:4;
 7    short s1:4;
 8    short s2:8;
 9    int i;
10}
;
11int main ()
12
13    A a; 
14    a.c1=1;a.c2=2;a.s1=3;a.s2=4;a.i=5;
15    printf("sizeof(A)=%d\n",sizeof(A)); 
16    return 0;
17}
將一步一步來分析內(nèi)存情況:
1、從起始地址(假設(shè)為零)為c1分配空間,如下圖:

2、接下來,為c2分配空間,由于c1和c2的類型都為char,且c1和c2的位寬之和為8不大于類型char的位寬8,根據(jù)規(guī)則1,c2的空間分配如下:


3、接下來,為s1分配空間,此時(shí),有一個(gè)問題,s1的內(nèi)存空間的起始地址是從哪兒開始呢?1還是2?根據(jù)上一節(jié)介紹的我們可知,s1的對齊模數(shù)為2,此處上一節(jié)的規(guī)則規(guī)則依然適用,結(jié)合這里的第三條,1處,填充CC,從2處開始分配:

4、接下來,為s2分配空間,重復(fù)第二步,非配如下(此處也要注意一下的,因?yàn)橐粋€(gè)s2的空間非配跨越了兩個(gè)字節(jié),而且都不是完整的占有一個(gè)字節(jié)):

5、接下來為i分配內(nèi)存空間便如同上一節(jié)講的一樣了,如下圖:


6、我們看最終的內(nèi)存空間分配結(jié)果:

7、最終的運(yùn)行結(jié)果,也與分析一致:


呵呵,如果上邊的你都看懂了,何不做做下邊的這個(gè)小練習(xí)呢?看看你能做對不~