填充c结构的最后一个成员

时间:2011-08-29 04:15:36

标签: c struct padding memory-alignment

我总是假设,正如他们在这里所说http://en.wikipedia.org/wiki/Data_structure_alignment,“重要的是要注意最后一个成员填充所需的字节数,以便结构的总大小应该是最大的倍数对齐任何结构成员“

所以对于像这样的结构,它的大小应该是32位处理器

typedef struct
{
   double   s;  /* 8 bytes */
   char     c;  /* 7 bytes padding at the end of make the total size 8*2 */
} structa_t;  

所以我很惊讶大小是12而不是16!这是为什么 ?有人能对它施加一些启示吗?

sizeof(double) = 8
sizeof(structa_t) = 12

BTW,系统信息

$ uname -a
Linux 2.6.18-8.el5xen #1 SMP Thu Mar 15 21:02:53 EDT 2007 i686 i686 i386 GNU/Linux
$ gcc --version
gcc (GCC) 4.1.1 20070105 (Red Hat 4.1.1-52)

3 个答案:

答案 0 :(得分:4)

这里的关键措辞是:

  

......结构的总大小应该是任何结构成员的最大对齐的倍数......

在您的系统上,double的对象是4,而不是8。

如果您等待C1x,则可以使用_Alignof运算符(类似于sizeof)。在您的系统上,

sizeof(double) == 8
_Alignof(double) == 4

您可以在C89中以更原始的方式测试对齐,

#include <stdlib.h>
struct char_double { char x; double y; };
#define DOUBLE_ALIGNMENT offsetof(struct char_double, y)

或者使用宏

#define alignof(x) offsetof(struct { char a; x b; }, b)

答案 1 :(得分:1)

对于这样的细节,维基百科不是特别可靠的来源。

在这种情况下,结构中最大项的大小形成(整个可能填充结构的大小的(相当硬)上限 - 但实现是如果认为合适,可以自由使用较少的填充。在许多情况下,“N位”处理器,对特定结构可以做任何好处的最大填充将是较小的:1)结构中的最大项,或2)处理器本身的“位数” (因此,对于32位处理器,您经常不需要/想要填充大于32位的边界,即使对于大于此的数据项也是如此。)

答案 2 :(得分:0)

因为在你的情况下,结构与字边界对齐(其中一个字= 4个字节)。