【问题标题】:64 bit alignment/padding for c structure?c结构的64位对齐/填充?
【发布时间】:2012-11-07 15:03:07
【问题描述】:
struct tag_t_ {
    u_int8_t op;
    u_int8_t num;
    u_int32_t labels[5];
};

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

【问题讨论】:

    标签: c 64-bit padding


    【解决方案1】:

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

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

    sizeof(struct) == 24

    // 这里可以在字符和第一个 32 位整数之间放置一个无符号短整数,而不影响结构的大小。

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

    32/64 位系统之间存在差异:32 位系统仍会将 8 字节变量与 32 位边界对齐。 64 位系统会将 long int 和 double 对齐到 8 字节边界。

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

    【讨论】:

      【解决方案2】:

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

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

      由于填充的原因,如果在 64 位机器上将 sizeof (tag_t_) 字节写入某些外部媒体,传输媒体然后尝试在 32 位机器上读取 sizeof (tag_t_) 会失败。所以不要那样做。逐个字段序列化结构,并以相同的方式反序列化它们。

      【讨论】:

      • +1 用于获取系统之间的传输结构,这是导致填充相关问题的主要原因。
      【解决方案3】:

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

      然后将由 32 位编译器负责对齐,并相应地生成地址。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2018-03-04
        • 2012-09-01
        • 2016-12-11
        • 2021-12-28
        • 1970-01-01
        • 1970-01-01
        • 2020-07-26
        • 1970-01-01
        相关资源
        最近更新 更多