struct tag_t_ {
u_int8_t op;
u_int8_t num;
u_int32_t labels[5];
};
Run Code Online (Sandbox Code Playgroud)
在上面的结构中,64位编译器将在哪里添加填充字节?
它是在第一个标签之前还是在第一个标签的末尾?
如果填充位于第一个标签的末尾,那么在访问(读取)32 位拱形中的第一个标签时是否会导致任何错误结果?
我在 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 位系统中使用该结构体变得安全。如果结构中有双精度数,仍然可以通过仔细规划变量来使结构兼容。