c结构的64位对齐/填充?
在上面的结构中,64位编译器将在哪里添加pad字节c结构的64位对齐/填充?,c,64-bit,padding,C,64 Bit,Padding,在上面的结构中,64位编译器将在哪里添加pad字节 它是在第一个标签之前还是在第一个标签的末尾? 如果填充在第一个标签的末尾,在访问(读取)32位ARCH中的第一个标签时是否会导致任何错误结果?填充通常应用于每个字段的末尾。不,64位编译的二进制文件与32位二进制文件不兼容。因此,您可能需要重新编译32位体系结构的所有内容 然后,32位编译器将负责对齐,并相应地生成地址。这取决于编译器,没有通用规则可以应用并保证保持不变 我不确定问题的后半部分,因为在32位体系结构上,编译器当然会有所不同。直接
它是在第一个标签之前还是在第一个标签的末尾?
如果填充在第一个标签的末尾,在访问(读取)32位ARCH中的第一个标签时是否会导致任何错误结果?填充通常应用于每个字段的末尾。不,64位编译的二进制文件与32位二进制文件不兼容。因此,您可能需要重新编译32位体系结构的所有内容
然后,32位编译器将负责对齐,并相应地生成地址。这取决于编译器,没有通用规则可以应用并保证保持不变 我不确定问题的后半部分,因为在32位体系结构上,编译器当然会有所不同。直接转移结构从来不是一个好主意
由于填充,如果您将
sizeof(tag\u\t)
字节写入64位机器上的某些外部媒体,传输媒体,然后尝试在32位机器上读取sizeof(tag\u\t)
,则会失败。所以不要那样做。逐字段序列化结构,并以相同的方式反序列化它们。我在64位系统中运行此操作——结构的内存映射为
struct tag_t_ {
u_int8_t op;
u_int8_t num;
u_int32_t labels[5];
};
sizeof(结构)==24
//在这里,可以在字符和第一个32位整数之间填充一个无符号的短字符,而不影响结构的大小
结构填充的规则是,任何宽度为W的基本变量都将与该宽度对齐。作为第二个参数,Double将导致op
之后有7个填充字节,而num
之后只有3个填充字节,因为标签[0]将从可被4整除的偏移量开始
32/64位系统之间存在差异:32位系统仍将8字节变量与32位边界对齐。64位系统将对齐长整数和双字节到8字节的边界
这将使在32位系统中使用该结构变得安全。如果结构中有双重变量,仍然可以使结构与仔细规划变量兼容 +1用于拾取系统之间的传输结构,这是填充相关问题的主要原因。
offset: variable
0: op num
2: 00 00 // only 2 paddings
4: label0
8: label1
...
20: label5