【问题标题】:size of struct in C [duplicate]C中结构的大小[重复]
【发布时间】:2010-12-22 22:45:09
【问题描述】:

可能重复:
Why isn’t sizeof for a struct equal to the sum of sizeof of each member?

考虑以下 C 代码:

#include <stdio.h>    

struct employee
{
  int id;
  char name[30];  
};

int main()
{
  struct employee e1;      
  printf("%d %d %d", sizeof(e1.id), sizeof(e1.name), sizeof(e1));
  return(0);
}

输出是:

4 30 36

为什么结构的大小不等于其各个组件变量的大小之和?

【问题讨论】:

标签: c struct structure-packing


【解决方案1】:

编译器可能会为对齐要求添加填充。请注意,这不仅适用于结构字段之间的填充,还可能适用于结构的末尾(这样结构类型的数组将正确对齐每个元素)。

例如:

struct foo_t {
    int x;
    char c;
};

即使 c 字段不需要填充,该结构通常也会有一个 sizeof(struct foo_t) == 8(在 32 位系统上 - 而不是具有 32 位 int 类型的系统),因为需要在 c 字段之后是 3 个字节的填充。

请注意,系统(如 x86 或 Cortex M3)可能不需要填充,但出于性能原因,编译器可能仍会添加它。

【讨论】:

  • +1,虽然对齐到 6 个字节听起来很奇怪。不过,也许我在低级的东西上有点落后。
  • 好吧,名称从偏移量 4 开始(足够合理)并扩展到 34。34 不是 4 的倍数,因此它以 36 结尾,即 9*4。对我来说很有意义!
  • 它与 32 位边界对齐(4,8,16,24,32,36,...)
  • 它没有对齐到 6 个字节。 int 占用 4 个字节,char[30] 占用 32 个字节,都是 4 的倍数,因此结构的大小也是 4 个字节的倍数。
  • 啊,这很有道理。
【解决方案2】:

如前所述,C 编译器将为对齐要求添加填充。这些要求通常与内存子系统有关。某些类型的计算机只能访问排列为某个“不错”值的内存,例如 4 个字节。这通常与字长相同。因此,C 编译器可能会将结构中的字段与该值对齐,以使它们更易于访问(例如,4 字节值应该是 4 字节对齐)此外,它可能会填充结构的底部以排列结构后面的数据.我相信还有其他原因。更多信息可以在this维基百科页面找到。

【讨论】:

    【解决方案3】:

    您的默认对齐方式可能是 4 个字节。要么 30 字节的元素得到 32,要么整个结构被四舍五入到下一个 4 字节间隔。

    【讨论】:

      【解决方案4】:

      对齐到 6 个字节并不奇怪,因为它对齐到多个到 4 的地址。

      所以基本上你的结构中有 34 个字节,下一个结构应该放在地址上,即 4 的倍数。34 之后最接近的值是 36。这个填充区域计入结构的大小。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2012-01-22
        • 1970-01-01
        • 2021-07-09
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-02-17
        • 1970-01-01
        相关资源
        最近更新 更多