sizeof c struct仅包含char字段

hen*_*ew5 4 c struct memory-alignment struct-member-alignment

我理解填充是如何工作的.我知道对齐是什么.对我来说奇怪的是,为什么只有char字段的struct的大小不对齐到4个字节(末尾的填充)?我怀疑这不是规范所保证的,所以编译器不这样做.如果是这种情况,我可以参考这样的规则吗?我最感兴趣的是x86和x86-64架构.

例:

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

int main(void)
{
    printf("sizeof=%lu\n", sizeof foo2);
}
Run Code Online (Sandbox Code Playgroud)

输出: sizeof=3

pax*_*blo 6

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

由于此处的所有字段都具有一个对齐要求,这也是结构本身的对齐要求.

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

对比:

struct moreComplexCase {
    char char1WithAlignment1;
    // 3 byte gap to align below item.
    unint32_t uintWithAlignment4;
    char char2WithAlignment1;
    // 3 byte gap to align structure itself.
}
Run Code Online (Sandbox Code Playgroud)

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

最后的填充是为了确保数组的第二个元素(并且,就此而言,所有后续元素)也将正确对齐.

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