结构填充的规则是什么[重复]

问题描述 投票:0回答:1

这个问题在这里已有答案:

我已经浏览了geeksforgeeks,https://www.geeksforgeeks.org/is-sizeof-for-a-struct-equal-to-the-sum-of-sizeof-of-each-member/中的结构填充帖但我不知道为什么在这种情况下:

int main() 
{ 

    struct C { 
        // sizeof(double) = 8 
        double z; 

        // sizeof(short int) = 2 
        short int y; 
        // Padding of 2 bytes 

        // sizeof(int) = 4 
        int x; 
    }; 

    printf("Size of struct: %d", sizeof(struct C)); 

    return 0; 
} 

我知道y(short int)后跟x(int),因此在y之后需要填充。但为什么这里的填充是2?

c structure padding
1个回答
1
投票

编译器想要将int对齐在一个四字节的边界上,并且它比它短两个字节,因此填充计算为两个字节:

struct C { 
    // offset = 0
    double z; 
    // offset = 8
    short int y; 
    // offset = 10
    // ... padding ...
    // offset = 12
    int x; 
    // offset = 16
}; 

下一个四个大于10的倍数是12。

编辑:在实践中,结构遵循此算法(伪代码):

offset = 0;
alignment = 1;
for each field in structure {
    offset = (offset + field.alignment - 1) / field.alignment * field.alignment;
    field.offset = offset;
    alignment = lcm(alignment, field.alignment);
}
structure.alignment = alignment;
structure.size = (offset + alignment - 1) / alignment * alignment;
© www.soinside.com 2019 - 2024. All rights reserved.