2014-10-07 138 views
0

我想知道爲什麼我們必須爲結構的對齊大小,將對齊大小等於結構中的最大構件大小。內存對齊到結構中 - 對齊大小等於最大成員大小

例子:

struct MixedData 
{ 
    char Data1; 
    short Data2; 
    int Data3; 
    char Data4; 
}; 

如果我們把最大的成員(int Data3),對齊爲4個字節,所以我們要做的:

struct MixedData /* After compilation in 32-bit x86 machine */ 
{ 
    char Data1; /* 1 byte */ 
    char Padding1[1]; /* 1 byte for the following 'short' to be aligned on a 2 byte boundary 
         assuming that the address where structure begins is an even number */ 
    short Data2; /* 2 bytes */ 
    int Data3; /* 4 bytes - largest structure member */ 
    char Data4; /* 1 byte */ 
    char Padding2[3]; /* 3 bytes to make total size of the structure 12 bytes */ 
}; 

但是我爲什麼不有,char Data1後, char Padding1[3] so short Data2開始於adress(Data1) + 4而不是char Data1[1]

而且,在邏輯相同的情況下,爲什麼short Data2之後沒有short Padding3[1]

另一個問題是:如果我在64位處理器,應該使用一個8個字節alignement,所以我已設置以下:

struct MixedData /* After compilation in 64-bit x86_64 machine */ 
{ 
    char Data1; /* 1 byte */ 
    char Padding1[7]; /* 7 bytes */ 
    int Data3; 
    int Padding2[1]/* 4 bytes */ 
    char Data4; 
    char Padding3[7]; /* 7 bytes to make total size of the structure 24 bytes */ 
}; 

所以總大小24字節是8字節的倍數?

+3

填充通常做的「自然」對齊一個字段。也就是說,dword字段是雙字對齊的,字字段是字對齊的,依此類推。對於訪問不是雙字對齊的字大小字段(但是字對齊)沒有懲罰。 – 2014-10-07 22:57:48

+0

@ 500-InternalServerError:應該已發佈爲答案而不是評論。 – 2014-10-07 23:37:51

回答

0

結構的OVERALL對齊應該是對齊要求最高的元素。這是爲了確保例如結構數組始終對齊所需的。如果你沒有,那麼struct { int x; char c; };的大小會有第一個元素對齊,但接下來的三個將會有x未對齊。

通常可以說服編譯器生成一個「打包」的數據結構(沒有對齊填充)並且使用它來獲得壓縮數組,但是在所有非常特殊的情況下使用它是個壞主意,因爲它最多隻會慢一些,最糟糕的是它會導致執行停止,因爲處理器中存在「未對齊的訪問陷阱」。

如果int的大小是4字節[我知道所有的編譯器 - long是4或8字節,取決於編譯器],都在32位和64位(至少x86)將4字節對齊。

如果你想有一個結構體的7字節的「缺口」,這會工作:

struct X { 
    char c; 
    uint64_t x; 
}; 

這當然會具有:

struct X { 
    char c; 
    char padding[7]; 
    uint64_t x; 
};