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_two
和y_structures[0].int_one
的地址之间的差异是7个字节。我认为它应该是3个字节,因为在char_two
之后要对齐的类型是y_structures[0]
的int,并且它在两个体系结构上的大小都是4。请帮助
答案 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字节大小。