繁体   English   中英

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

[英]64 bit alignment/padding for c structure?

struct tag_t_ {
    u_int8_t op;
    u_int8_t num;
    u_int32_t labels[5];
};

在上面的结构中,将由64位编译器添加填充字节?
是在第一个标签之前还是在第一个标签的末尾?
如果填充位于第一个标签的末尾,那么在访问(读取)32位拱中的第一个标签时是否会导致任何错误结果?

这取决于编译器,没有可以应用并保证保持的通用规则。

我不确定问题的后半部分,因为在32位架构上,编译器当然会有所不同。 直接转移结构永远不是一个好主意。

由于填充,如果您将sizeof (tag_t_)字节写入64位计算机上的某些外部介质,传输介质然后尝试读取32位计算机上的sizeof (tag_t_) ,它将失败。 所以不要这样做。 逐个字段地序列化结构,并以相同的方式对它们进行反序列化。

我在64位系统中运行它 - 结构的内存映射是

offset:  variable
     0:  op num     
     2:  00 00   // only 2 paddings
     4:  label0
     8:  label1
         ...
    20:  label5

sizeof(struct)== 24

//这里可以在chars和第一个32位整数之间插入无符号的short,而不会影响struct的大小。

struct padding的规则是任何宽度为W的基本变量都将与该宽度对齐。 作为第二个参数的double将在op之后导致7个填充字节,并且在num之后仅导致3个填充字节,因为标签[0]将在可被4整除的偏移处开始。

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

这样可以安全地在32位系统中使用该结构。 如果结构中有双精度数,那么仍然可以使结构与仔细规划变量兼容。

填充通常应用于每个字段的末尾。 不,64位编译二进制文件与32位二进制文​​件不兼容。 因此,您可能必须重新编译32位架构的所有内容。

然后将通过32位编译器处理对齐,并相应地生成地址。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM