为什么填充的添加,如果焦炭来INT后?为什么填充的添加,如果焦炭来INT后?(Why padding

2019-05-12 06:29发布

例如,有一种结构

struct A
{
char a;
int i;
};

在这种情况下,我们有一个[1个字节] +填充[3字节] + INT [4字节] = 8。

现在,让我们的小更新成以上结构,

struct A
{
int i;
char a;
};

在这种情况下焦炭来int和无需添加填充字节之后,这意味着的sizeof(A)= 5字节,但在这种情况下,我也得到了8字节的结果。 为什么呢?

好吧,什么这个案子

struct s
   {
       int b;
       double c;
       char a;
   };

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

Answer 1:

在这种情况下char来后int和无需添加填充字节,这意味着sizeof(A) = 5字节,但在这种情况下,我也得到了8字节的结果。 为什么呢?

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

数据结构是对准数据被布置和在计算机存储器访问的方式。 它由两个独立但相关的问题: 数据比对数据结构的填充当现代计算机读出或写入到存储器地址,这将在字大小的块(例如,4字节块的32位系统上)或更大做到这一点。 数据对准装置把在存储器偏移量等于字尺寸,这提高了系统的性能的某个倍数的数据由于CPU处理存储器的方式 。 要对齐的数据,可能有必要在最后一个数据结构的末尾和下一个的开始,这是数据结构填充之间插入一些无意义字节。

为了使尺寸倍数4 (对准int ),第二个片段将与被填充3个字节。 编译后的第二个片段将被填充的为正确对齐

struct A
{
    int i;
    char a; 
    char Padding[3]; // 3 bytes to make total size of the structure 8 bytes
};    

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

  • 当一个结构件,然后用一个较大的对齐要求一个部件或在结构的端部填充只能插入。
  • 的最后一个成员被填充以使得该结构的总大小应该是任何结构构件的最大对齐的倍数所需要的字节数。

的情况下

struct s
{
    int b;
    double c;
    char a;
};  

定位将发生如

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 
};   

还要注意的是,通过改变构件的排序中的结构,可以改变填充的,以保持对准所需的量。 这可以通过,如果成员由降序排列排序的要求来完成。

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 
};   


Answer 2:

究其原因,编译器必须在你的结构的末尾添加填充的是,结构体可以是阵列的一部分,并且一个阵列的每个元件必须正确对齐。

看来你的平台想一个int对齐到4个字节。

如果你宣布你的阵列struct A

struct A array[2];

然后,第一int的构件array[1]还应当具有的4个字节的比对。 因此,编译器垫的struct A要8个字节,以实现这一点,而如果它没有添加任何填充和sizeof(struct A)进行了5个字节, array[1]不会被适当地对准。

(请注意,一个编译器不能插入填充其间的阵列元件,填充必须阵列元件本身的一部分,因为sizeof array必须是相同sizeof(struct A) * 2在上述情况下)



Answer 3:

不仅每个成员struct必须一致的数据,但struct本身具有对准的最大件的尺寸struct 。 所以,填充被添加到struct A使得其大小应的较大的倍数sizeof isizeof a

看看位于C FAQ 这里



Answer 4:

如果一个人将有结构的阵列,该阵列中的所有元素都必须具有相同的尺寸和对准; 这将意味着用于在阵列中的东西尺寸必须对准的倍数。 唯一的时间这将是有其尺寸不对齐的倍数将是如果它不是直接结合到另一个数组,但代替用作另一结构的一部分的结构是有用的。 作为值得特别注意在语言设计的那种情况确实时有发生,但不是充分频繁。



文章来源: Why padding are added, if char comes after int?