1. 程式人生 > >結構體成員的對齊方式

結構體成員的對齊方式

我們都知道每種資料型別佔有的記憶體空間大小都是明確,比如:char型別佔一個位元組,int型別佔4個位元組等等。我們可以通過使用sizeof關鍵字得到各種資料型別的長度:

例如:sizeof(char);//佔1個位元組 

sizeof(int); //佔4個位元組 

sizeof(short); //佔2個位元組

sizeof(double); //佔8個位元組

對於結構體來說,結構體也是一種資料型別,接下討論關於結構體型別佔記憶體空間的大小:

例如下面的程式:

#include<iostream>
using namespace std;


struct STR
{
    char i;
    int j;
    short k;
    double m;
    int n;
    char l;
};


int main()
{

    STR x;
    cout<<sizeof(char)<<endl;
    cout<<sizeof(int)<<endl;
    cout<<sizeof(short)<<endl;
    cout<<sizeof(double)<<endl;

    cout<<"sizeof(STR)="<<sizeof(STR)<<endl;

    return 0;
}

當提及結構體型別所佔記憶體空間的時候,通常我們都會將結構體中定義的型別各自所佔的位元組數加起來;一般來說,則上述結構體中的位元組數應該為:1+4+2+8+4+1=20個

但是對於結構體,這種求記憶體空間大小的方法正確嗎?可能此時內心很矛盾,到底是對還是錯?答案是:錯的。內心是不是很崩潰!!!有圖有真相:

從上圖可以看出針對上面程式中定義的結構體實際上是佔32個位元組,,為什麼會是這種結果呢?

結構體成員是有一種預設的對齊的方式的:在本例中,結構體中的char,int,short為與double對齊,所以必須要湊夠8個位元組,char,int佔了8個位元組,為對齊所以short也佔了8位元組,下面int和char也湊夠了8位元組,所以共佔了32個位元組。