为什么为结构的多个数据成员而不是单个成员添加填充?

Laa*_*vaa 7 c c++ linux operating-system

为什么仅当存在多个结构成员时才添加填充的概念,为什么在存在单个基本数据类型成员时不包括填充?

如果我们考虑在32位机器上

struct 
{
    char a;
} Y;
Run Code Online (Sandbox Code Playgroud)

没有填充,并且Y的大小为1个字节.

如果我们考虑这个结构

struct 
{
    char a;
    int b;
} X;
Run Code Online (Sandbox Code Playgroud)

X的大小为8字节.

我的问题是为什么在第二种情况下填充添加?如果要通过机器进行高效访问,通常以4字节的倍数读取数据,那么为什么第一种情况下没有填充?

Luc*_*ore 10

在第二种情况下添加填充,因为在您的机器上,a int与4个字节对齐.所以它必须驻留在一个可被4整除的地址.

0x04   0x05   0x06   0x07   0x08   0x09   0x0A   0x0B

  a      b      b      b      b     
Run Code Online (Sandbox Code Playgroud)

如果没有添加填充,则int成员从地址开始0x05,这是错误的.添加3个填充字节:

0x04   0x05   0x06   0x07   0x08   0x09   0x0A   0x0B

  a   |      padding      |   b      b      b      b
Run Code Online (Sandbox Code Playgroud)

现在int0x08,这是好的.