結構體地址對齊解釋

**重要** **三條原則:**
一、結構體變量中成員的偏移量必須是成員大小的整數倍(0被認爲是任何數的整數倍)
 二、結構體大小必須是所有成員大小的整數倍。
三、結構體中的成員是結構體類型時只需把其展開,展開後的結構體的第一個成員的偏移量應當是被展開的結構體中最大的成員的整數倍。
基本數據類型的長度int=4,char=1,short=2,double=8;
根據這三條原則我們去分析:
##第一種

struct TestSt{
    int a;
   char b;
   int c;
}; 
根據第一條,a的偏移量是0,符合;b的偏移量是4(計算=a的偏移量0+a的長度4),4/1=4,符合;c的偏移量是5(計算=b的偏移量+b的長度1),5/4 !=整數,不符合;所以b的地址需要進行偏移,偏移多少呢?b偏移後的數能夠被c的長度4整除,所以(5+偏移3)=8可以被4整除,所以b需要偏移3個,綜上所述,TestSt的長度是12(a=4,b=4,c=4);
根據第二條,12是a=4的整數倍,12是b=1的整數倍,12是c=4的整數倍;符合;
第三條忽略,
所以結構體TestSt對齊後的長度是12


##第二中成員包含結構體

 

struct TestSt{
    double c;
    struct{
        char a;
        short b;
    }st;
};
結構體TestSt有一個成員st是結構體,
根據第三條,st最大的成員長度是b=2;所以a的偏移量是2;TestSt的長度8+a的長度2+b的長度2=12;TestSt的長度是12嗎?顯然不是,因爲我們還沒有對照是不是符合第一和第二條的原則;
根據第一條,c的偏移量是0,符合;a的偏移量是2,符合;b偏移量是4也符合,
根據第二條,12顯然不能被8整除,16纔可以被8整除,所以a需要偏移5的長度,最後TestSt的長度是16;

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章