2016-07-24 160 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个字节