c語言資料結構補齊原則

PengPengBlog發表於2017-01-06
/* 
 
    原則1、資料成員對齊規則:結構(struct或聯合union)的資料成員,第一個資料成員放在offset為0的地方,以後每個資料成員儲存的起始位置要從該成員大小的整數倍開始(比如int在32位機為4位元組,則要從4的整數倍地址開始儲存)。 
 
    原則2、結構體作為成員:如果一個結構裡有某些結構體成員,則結構體成員要從其內部最大元素大小的整數倍地址開始儲存。(struct a裡存有struct b,b裡有char,int,double等元素,那b應該從8的整數倍開始儲存。) 
 
    原則3、收尾工作:結構體的總大小,也就是sizeof的結果,必須是其內部最大成員的整數倍,不足的要補齊。 
  */  
#include <iostream>  
  
using namespace std;  
  
struct A  
{  
    short a; //大小為2, 因為b的大小是4,所以要補2  
    int b; //大小為4  
    char c; // 大小為1  
    // 所以2+2+4+1+3 = 12 ,最後的三,因為“原則3”,9並不是4的倍數,所以需要補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的倍數,所以int後要補4位  
    float c; // 大小為8, 地址正好是8的倍數,所以不用補位  
    // 所以 4+4+8+8 = 24;  
};  
  
struct D  
{  
    char e[2]; //大小為2,因為f為4,所以補2 = 4  
    int f; // 大小為4,因為e補了2所以g的起始地址正好是8的倍數,所以不用補位  
    double g; // 大小為8  
    float h; // 大小為8  
    struct C i; // 因為前面總數為8的倍數(C的最大值為8)所以不用補位(總大小為24)  
    // 所以 2+2+4+8+8+24 = 48,滿足第三條  
};  
  
int main(int argc, char *argv[])  
{  
    QCoreApplication a(argc, argv);  
  
    cout << "sizeof(A)=" << sizeof(A) << endl;  
    cout << "sizeof(B)=" << sizeof(B) << endl;  
    cout << "sizeof(C)=" << sizeof(C) << endl;  
    cout << "sizeof(D)=" << sizeof(D) << endl;  
    return a.exec();  
}  

相關文章