C结构填充。嵌套结构

时间:2014-08-19 07:46:40

标签: c compiler-construction struct padding

struct Y{
  int int_one;
  int int_two;
  void * pointer;
}

struct X{
    char char_one;
    char char_two;
    struct Y y_structures[20];
 }

32位和64位计算机上的填充不同。我不知道为什么。 据我所知,填充应如下:

 0x0 char_one <br>
 0x1 char_two <br>
 0x4 y_structures[0].int_one <br>
 0x8 y_structures[0].int_two <br>
 0x12 y_structure[0].pointer <br>

32位上的结构与上面提到的类似,但在64位机器上,char_twoy_structures[0].int_one的地址之间的差异是7个字节。我认为它应该是3个字节,因为在char_two之后要对齐的类型是y_structures[0]的int,并且它在两个体系结构上的大小都是4。请帮助

3 个答案:

答案 0 :(得分:3)

问题不在于int,它是指针。指针在64位机器上的大小为8字节,因此它们必须从内存地址mod 8开始。

0x0 char_one
0x1 char_two
0x8 y_structures[0].int_one
0x12 y_structures[0].int_two
0x16 y_structure[0].pointer
0x24 y_structures[1].int_one
0x28 y_structures[1].int_two
0x32 y_structure[1].pointer
...

所以必须有6个填充字节。这在32位机器上是不必要的,因为指针只有4个字节。

答案 1 :(得分:0)

32/64位系统之间存在差异:32位系统仍将8字节变量与32位边界对齐。 64位系统将长整数和双精度对齐为8字节边界。

答案 2 :(得分:-1)

此外,您必须记住,某些体系结构需要数据对齐(只有在地址对齐时才能访问数据)。它可以是32位架构,例如,你可以使用4个char元素和结构大小为16字节大小。