2017-03-16 80 views
0

我知道結構中的內存對齊方式,但我很難於看到我正在處理的項目中遇到的這種實現。調整結構中的內存對齊方式

struct default { 
    uint8_t variable[((sizeof(struct dummyStructure) + 3) /4)*4] // Align on 32 bit boundary 
} 

,因爲我沒有訪問功能,但任何人都可以在這裏說明一下用來導致此對準發生算算它更像此刻黑盒測試我。

+0

是什麼讓你認爲這個結構有32位對齊? uint8_t數據類型有1個字節對齊。數組也將有1個字節對齊。無論大小。結構相同。在平臺上,我知道它會有1個字節的對齊 –

回答

1

可以分解它:

uint8_t variable[((sizeof(struct dummyStructure) + 3) /4)*4] 

你有兩個案例 - sizeof dummyStructure是4或不均勻整除。

實施例:

(sizeof(struct dummyStructure) = 12 
(12 + 3)/4 = 15/4 = 3 
3 * 4 = 12 

所以返回原來的大小

(sizeof(struct dummyStructure) = 13 
(13 + 3)/4 = 16/4 = 4 
4 * 4 = 16 

所以通過返回下一尺寸均勻可分4

(sizeof(struct dummyStructure) = 15 
(15 + 3)/4 = 18/4 = 4 
4 * 4 = 16 

如上

(sizeof(struct dummyStructure) = 16 
(16 + 3)/4 = 19/4 = 4 
4 * 4 = 16 

所以回到原來的尺寸再次

(sizeof(struct dummyStructure) = 17 
(17 + 3)/4 = 20/4 = 5 
5 * 4 = 20 

所以由4

回到未來大小均勻可分實際上這段代碼不能在32位地址對齊變量!它只在數組中分配足夠的空間以允許手動賦值dummyStructure。 這個解決方案非常糟糕。

恕我直言更好的解決方案(當然取決於在代碼中會發生什麼):

1)由於C11

struct defaultx 
{ 
    alignas(4) int variable[sizeof(struct dummyStructure)]; 
}; 

2)GCC或特定鐺

struct defaultx 
{ 
    int variable[sizeof(struct dummyStructure)]; 
} __attribute__((aligned(4))); 

將確保變量對齊到4個字節;

+0

關於「這個代碼(OP的)不能在32位地址對齊變量的好的觀察」。 – chux

1

的回答你的問題是,通過增加3至dummyStructure的大小,並採取由4分割的結果的整數部分乘以4,你要麼有:

  1. dummyStructure的確切大小,如果它與32位(或其任何倍數,如64位)對齊。
  2. 或者比dummyStructure的大小大32位的第一倍數。

因此,它總是會產生一個4字節的可分割數字(32位對齊)。

實施例:

如果dummyStructure的大小是8個字節,其結果將是((8 + 3)/ 4)* 4 = 8。

現在,如果dummyStructure的大小,可以說11,結果將是((11 + 3)/ 4)* 4 = 12

我只是想知道,爲什麼開發商決定這一點,不過,由於dummyStructure應該總是按照處理器架構進行對齊。