4

我了解填充的工作原理。我知道对齐是什么。对我来说奇怪的是,为什么只有 char 字段的结构的大小没有与 4 个字节对齐(最后填充)?我怀疑规范根本无法保证这一点,因此编译器不会这样做。如果是这种情况,我可以获得对此类规则的参考吗?我最感兴趣的是 x86 和 x86-64 架构。

例子:

struct foo {
    char field1;
    char field2;
    char field3;
} foo2;

int main(void)
{
    printf("sizeof=%lu\n", sizeof foo2);
}

输出:sizeof=3

4

1 回答 1

6

结构的对齐方式必须使其所有字段也正确对齐(特别是如果它们是数组的一部分)。

由于这里的所有字段都有一个对齐要求,这也是结构本身的对齐要求。

换句话说,如果您将其中两个结构相邻放置,则任何一个结构中的任何字段都不会违反对齐要求。

与之对比:

struct moreComplexCase {
    char char1WithAlignment1;
    // 3 byte gap to align below item.
    unint32_t uintWithAlignment4;
    char char2WithAlignment1;
    // 3 byte gap to align structure itself.
}

您将在那里看到两个填充部分。首先是确保uint32_t正确对齐(您还应该能够看到结构对齐也需要为四,以便uint32_t与给定的填充正确对齐)。

最后的填充是为了确保数组的第二个元素(以及所有后续元素)也将正确对齐。

C 标准本身并没有规定对齐是什么,只是可能存在对齐。例如,早期的 x86 芯片(可能还有当前的芯片)可以很好地处理未对齐的数据(或者可能会慢一点),而如果您尝试这样做,其他架构(例如,早期的 ARM 芯片)只会崩溃或引发错误.

于 2017-07-21T04:30:02.480 回答