如果在int之后出现char,为什么要添加填充?

7 c byte struct sizeof padding

例如,有一种结构

struct A
{
char a;
int i;
};
Run Code Online (Sandbox Code Playgroud)

在这种情况下,我们有[1字节] +填充[3字节] + int [4字节] = 8.

现在让我们对上面的struct进行一些更新,

struct A
{
int i;
char a;
};
Run Code Online (Sandbox Code Playgroud)

在这种情况下,char来自int并且不需要添加填充字节,这意味着sizeof(A)= 5字节,但在这种情况下我也得到8字节的结果.为什么?

好的,这个案子呢

struct s
   {
       int b;
       double c;
       char a;
   };
Run Code Online (Sandbox Code Playgroud)

根据下面给出的逻辑,有一个:size = b[4 bytes] + padding[4 bytes] + c[8] + a[1] + padding[7 bytes to align with double] = 24,但执行后我得到16.这怎么可能?

hac*_*cks 8

在这种情况下,char来后int并没有必要添加填充字节,这意味着sizeof(A) = 5字节,但在这种情况下,我也得到了8字节结果.为什么?

首先,您需要了解为什么需要填充?
维基说:

数据结构对齐是数据在计算机存储器中的排列和访问方式.它由两个独立但相关的问题组成:数据对齐数据结构填充.当现代计算机读取或写入存储器地址时,它将以字大小的块(例如,32位系统上的4字节块)或更大的块来执行此操作.数据对齐意味着将数据放入存储器偏移量等于字大小的某个倍数,这会因CPU处理内存的方式而提高系统性能.为了对齐数据,可能需要在最后一个数据结构的末尾和下一个数据结构的开始之间插入一些无意义的字节,即数据结构填充.

为了使4(对齐int)的大小倍数,第二个片段将用3字节填充.编译完成后,第二个片段将被填充以便正确对齐

struct A
{
    int i;
    char a; 
    char Padding[3]; // 3 bytes to make total size of the structure 8 bytes
};    
Run Code Online (Sandbox Code Playgroud)

编辑:永远记住这两个结构填充的黄金规则:

  • 仅当结构成员后跟具有较大对齐要求的成员或在结构的末尾时才插入填充.
  • 最后一个成员填充所需的字节数,以便结构的总大小应该是任何结构成员的最大对齐的倍数.

的情况下

struct s
{
    int b;
    double c;
    char a;
};  
Run Code Online (Sandbox Code Playgroud)

对齐将发生为

struct s
{
    int b;             // 4 bytes. b is followed by a member with larger alignment.
    char Padding1[4];  // 4 bytes of padding is needed 
    double c;          // 8 bytes
    char d;            // 1 byte. Last member of struct. 
    char Padding2[7];  // 7 bytes to make total size of the structure 24 bytes 
};   
Run Code Online (Sandbox Code Playgroud)

另请注意,通过更改结构中成员的顺序,可以更改维持对齐所需的填充量.如果成员按降序对齐要求排序,则可以执行此操作.

struct s
{ 
    double c;   // 8 bytes
    int b;      // 4 bytes 
    char a;     // 1 byte. Only last member will be padded to give structure of size 16 
};   
Run Code Online (Sandbox Code Playgroud)