Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/67.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/gwt/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
c结构的64位对齐/填充?_C_64 Bit_Padding - Fatal编程技术网

c结构的64位对齐/填充?

c结构的64位对齐/填充?,c,64-bit,padding,C,64 Bit,Padding,在上面的结构中,64位编译器将在哪里添加pad字节 它是在第一个标签之前还是在第一个标签的末尾? 如果填充在第一个标签的末尾,在访问(读取)32位ARCH中的第一个标签时是否会导致任何错误结果?填充通常应用于每个字段的末尾。不,64位编译的二进制文件与32位二进制文件不兼容。因此,您可能需要重新编译32位体系结构的所有内容 然后,32位编译器将负责对齐,并相应地生成地址。这取决于编译器,没有通用规则可以应用并保证保持不变 我不确定问题的后半部分,因为在32位体系结构上,编译器当然会有所不同。直接

在上面的结构中,64位编译器将在哪里添加pad字节
它是在第一个标签之前还是在第一个标签的末尾?

如果填充在第一个标签的末尾,在访问(读取)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