c - 结构填充的规则是什么

标签 c structure padding

我浏览了 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(短整型)后面跟着 x(整型),因此 y 之后需要填充。但为什么这里的padding是2呢?

最佳答案

编译器希望在四字节边界上对齐 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;

关于c - 结构填充的规则是什么,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55804546/

相关文章:

css - IE8 中的背景图片问题

javascript - jquery mobile 1.3.1 padding-top 在初始页面加载时计算不正确

c++ - 在 C++ 中填充仅包含一个 int 数组成员的结构?

java - 编程语言中的 char-int 等效项

c - 如何正确排序数组?

c - 如何在 bash 终端中测试?

list - 如何使用 R 自动创建结构列表?

c - 从二进制补码值获取负整数 嵌入式 C

c - 在分配内存之前对灵活成员数组的第一个元素使用 sizeof 是未定义的行为?

c - 在声明期间定义结构变量