C中结构的大小

44 c struct structure-packing

可能重复:
为什么structof sizeof不等于每个成员的sizeof之和?

考虑以下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);
}
Run Code Online (Sandbox Code Playgroud)

输出是:

4 30 36

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

Mic*_*urr 61

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

例如:

struct foo_t {
    int x;
    char c;
};
Run Code Online (Sandbox Code Playgroud)

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

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

  • 它没有与6个字节对齐.int占用4个字节,char [30]占用32个字节,两个都是4的倍数,使得结构的大小也是4个字节的倍数. (6认同)
  • 它与32位边界对齐(4,8,16,24,32,36,...) (3认同)
  • 好吧,该名称从偏移量 4(足够合理)开始并扩展到 34。34 不是 4 的倍数,因此它被填充到 36,即 9*4。我感觉合理! (2认同)