仅具有 char 字段的 sizeof c 结构
sizeof c struct with char fields only
我了解填充的工作原理。我知道对齐是什么。对我来说奇怪的是,为什么只有 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
结构的对齐方式必须使其所有字段也正确对齐(尤其是当它们是数组的一部分时)。
由于这里所有字段的对齐要求都是1,所以这也是结构本身的对齐要求。
换句话说,如果将其中两个结构并排放置,则任何一个结构中的字段都不会违反对齐要求。
对比:
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 芯片)如果您尝试这样做,只会崩溃或引发错误.
我了解填充的工作原理。我知道对齐是什么。对我来说奇怪的是,为什么只有 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
结构的对齐方式必须使其所有字段也正确对齐(尤其是当它们是数组的一部分时)。
由于这里所有字段的对齐要求都是1,所以这也是结构本身的对齐要求。
换句话说,如果将其中两个结构并排放置,则任何一个结构中的字段都不会违反对齐要求。
对比:
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 芯片)如果您尝试这样做,只会崩溃或引发错误.