2016-07-24 163 views
0

我想了解結構如何對齊。根據this source,我會期望結構C結構對齊

#include<inttypes.h> 
#include<stdio.h> 

typedef struct { 
    uint16_t a; 
    uint16_t b; 
    uint32_t c; 
} test_struct; 

int main (int argc, char const *argv[]) 
{ 
    printf("%lu\n", sizeof(test_struct)); 
    return 0; 
} 

大小爲12個字節。在我的例子中只需要8個字節。由於它包含一個32位整數,我認爲它應該對齊到4個字節,顯然情況並非如此。

環顧四周後,我發現這個this answer建議,只有成員本身需要對齊。

這完全解釋了我的結構體的大小,但是如何與我的第一個源聲明「一個結構實例將具有最廣泛標量成員的對齊方式」相對應?這是錯的還是我錯過了什麼?

+5

兩個' uint16_t'類型對齊,佔用4個字節; 'uint32_t'對齊4個字節;總數應該是8個字節。每種類型都必須與使用其自己的適當對齊的開始對齊。 –

+0

如果您已將結構順序更改爲'a,c,b',您將得到12,因爲需要在'a'和'c'之間填充/對齊2個字節以符合'c'的需要4字節對齊。 –

+1

該結構對齊到4個字節。你爲什麼認爲它不是? – melpomene

回答

2

您的來源都是正確的。

typedef struct { 
uint16_t a; // 2 bytes 
uint16_t b; // 2 bytes 
uint32_t c; // 4 bytes 
} test_struct; 

該結構的總大小爲8個字節。爲了確定是否需要填充,我們檢查最廣泛的標量成員(4個字節),並檢查該數字是否可以被無填充的總大小整除。

8 % 4 == 0

因此我們並不需要填充。

如果我們有:

typedef struct { 
uint16_t a; // 2 bytes 
uint16_t b; // 2 bytes 
uint32_t c; // 4 bytes 
uint16_t d; // 2 bytes 
} test_struct; 

總大小:10個字節需要

12 % 4 == 2

填充:2個字節

總實際尺寸:12個字節