1
如果我有一個如下所示的結構,在32位機器上,結構中是否會有填充?據我瞭解,這個結構將把所有東西都對齊到最大的字段,那麼如果最大的字段是一個字節(uint8)呢?結構填充和字節大小字段的對齊?
struct s {
uint8_t a[32];
uint8_t b[64];
};
謝謝。
如果我有一個如下所示的結構,在32位機器上,結構中是否會有填充?據我瞭解,這個結構將把所有東西都對齊到最大的字段,那麼如果最大的字段是一個字節(uint8)呢?結構填充和字節大小字段的對齊?
struct s {
uint8_t a[32];
uint8_t b[64];
};
謝謝。
成員之間可能有填充。
C標準6.7.2.1(15):在一個結構對象內,非位域成員和位域所在的單元的地址增加的順序是聲明的。指向適當轉換的結構對象的指針指向其初始成員(或者如果該成員是位域,則指向它所在的單位),反之亦然。 結構對象中可能存在未命名的填充,但不在其開頭。
(14)結構體或聯合體對象的每個非位字段成員都按照適用於其類型的實現定義的方式對齊。
現代機器上的成員之間可能沒有填充,但C不能保證它,所以不要依賴它。
您可以使用ofsetoff()宏確定是否存在填充,然後使用靜態聲明來管理該填充。
編譯器可以在'a'和'b'之間插入任意填充。但是,在實踐中,這裏不太可能這樣做。 –
@OliCharlesworth您的意思是說編譯器或開發人員不太可能這樣做?沒有理解你的評論的最後一部分:) – user3407764
@ user3407764:由於Oli沒有提到開發者,我要去編譯器。我相信的一點是,雖然規範說編譯器可以插入填充,但在這種情況下很少有人會打擾。 –