數(shù)據(jù)結(jié)構(gòu)補齊原則

原則1 數(shù)據(jù)成員對齊規(guī)則:結(jié)構(gòu)(struct或聯(lián)合union)的數(shù)據(jù)成員,第一個數(shù)據(jù)成員放在offset為0的地方,以后每個數(shù)據(jù)成員存儲的起始位置要從該成員大小的整數(shù)倍開始(比如int在32位機為4字節(jié),則要從4的整數(shù)倍地址開始存儲)。

原則2 結(jié)構(gòu)體作為成員:如果一個結(jié)構(gòu)里有某些結(jié)構(gòu)體成員,則結(jié)構(gòu)體成員要從其內(nèi)部最大元素大小的整數(shù)倍地址開始存儲。(struct a里存有struct b,b里有char,int,double等元素,那b應該從8的整數(shù)倍開始存儲。)

原則3 收尾工作:結(jié)構(gòu)體的總大小,也就是sizeof的結(jié)果,必須是其內(nèi)部最大成員的整數(shù)倍,不足的要補齊。

struct A  
{  
    short a; //大小為2, 因為b的大小是4,所以要補2  
    int b; //大小為4  
    char c; // 大小為1  
    // 所以2+2+4+1+3 = 12 ,最后的三,因為“原則3”,9并不是4的倍數(shù),所以需要補3  
};  
  
struct B  
{  
    int a; // 大小為4,  
    char b; // 大小為1,因為c大小為2,所以b需要補1  
    short c; //大小為2  
    // 所以4+1+1+2 = 8(也滿足原則3)  
};  
  
struct C  
{  
    int a; // 大小為4,開始為0,不用補位  
    double b; // 大小為8,開始不是8的倍數(shù),所以int后要補4位  
    float c; // 大小為8, 地址正好是8的倍數(shù),所以不用補位  
    // 所以 4+4+8+8 = 24;  
};  
  
struct D  
{  
    char e[2]; //大小為2,因為f為4,所以補2 = 4  
    int f; // 大小為4,因為e補了2所以g的起始地址正好是8的倍數(shù),所以不用補位  
    double g; // 大小為8  
    float h; // 大小為8  
    struct C i; // 因為前面總數(shù)為8的倍數(shù)(C的最大值為8)所以不用補位(總大小為24)  
    // 所以 2+2+4+8+8+24 = 48,滿足第三條  
};  
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容