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

use*_*194 4 c 64-bit padding

struct tag_t_ {
    u_int8_t op;
    u_int8_t num;
    u_int32_t labels[5];
};
Run Code Online (Sandbox Code Playgroud)

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

Aki*_*nen 5

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

offset:  variable
     0:  op num     
     2:  00 00   // only 2 paddings
     4:  label0
     8:  label1
         ...
    20:  label5
Run Code Online (Sandbox Code Playgroud)

sizeof(结构体) == 24

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

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

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

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