嵌套结构填充 - C - 64 位 - linux

use*_*887 5 c 64-bit nested structure padding

我在 C 中有以下嵌套结构。(64 位)

    typedef struct {
        int a;
        int b;
        int c;
        struct {
            int ab;
            long bc;
        }
        int d;
    } Test;

I see that,
a = 4 bytes
b = 4 bytes
c = 4 bytes
padding1 = 4 bytes 
inner structure = 16 bytes ( 4 bytes for ab, 4 bytes padding, 8 bytes for bc)
d = 4 bytes
padding2 = 4 bytes
Run Code Online (Sandbox Code Playgroud)

sizeof(Test) 返回 40 个字节。

我的问题:

  1. padding1 -> 为什么是 4 个字节?这是因为内部结构本身应该对齐吗?。(此外,它是否与 8 字节(长)或 16 字节(内部大小)边界对齐。?)

  2. padding2 -> 这是 4 字节的填充,因为在结构内部完成了最大对齐(8 位)??

谢谢,

Dan*_*her 6

  1. padding1 -> 为什么是 4 个字节?这是因为内部结构本身应该对齐吗?。(此外,它是否与 8 字节(长)或 16 字节(内部大小)边界对齐。?)

这是因为内部struct应该是 8 字节对齐的,这样long才能可靠地进行 8 字节对齐。

  1. padding2 -> 这是 4 字节的填充,因为在结构内部完成了最大对齐(8 个)??

在那里,整体的大小struct是八字节的倍数,以便内部struct可以在八字节边界上适当对齐。

在这种特殊情况下,如果struct可以将匿名成员与独立成员区别对待,则只需填充四个字节即可满足对齐要求struct,但 6.7.2.1

14 结构或联合对象的每个非位域成员都以适合其类型的实现定义方式对齐。

禁止这样做。因此,为了减小 的大小struct,程序员需要重新排列它,将奇数个int成员移动到内部struct(或在不经过匿名的情况下制作int ab;long bc;直接成员)。Teststruct