全攻略有點大放厥詞,嘩眾取寵了,其實是一些常見的問題罷了。但是自認為總結的還算全面一點吧,請大家多多賜教,我只是個初學者。

接下來主要討論四點:
一、不涉及位域的內存對齊
二、涉及位域的內存對齊
三、成員變量含有結構體的內存對齊情況
四、要求內存對齊的原因及優點

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

接著上一篇往下寫~~

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

 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}
將一步一步來分析內存情況:
1、從起始地址(假設為零)為c1分配空間,如下圖:

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


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

4、接下來,為s2分配空間,重復第二步,非配如下(此處也要注意一下的,因為一個s2的空間非配跨越了兩個字節,而且都不是完整的占有一個字節):

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


6、我們看最終的內存空間分配結果:

7、最終的運行結果,也與分析一致:


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