C语言结构体的对齐原则(一)

2014-07-19 22:53:18 · 作者: · 浏览: 244

  Q:关于结构体的对齐,到底遵循什么原则

  A:首先先不讨论结构体按多少字节对齐,先看看只以1字节对齐的情况:

  #include

  #include

  #define PRINT_D(intValue) printf(#intValue" is %d\n", (intValue));

  #define OFFSET(struct,member) ((char *)&((struct *)0)->member - (char *)0)

  #pragma pack(1)

  typedef struct

  {

  char sex;

  short score;

  int age;

  }student;

  int main()

  {

  PRINT_D(sizeof(student))

  PRINT_D(OFFSET(student,sex))

  PRINT_D(OFFSET(student,score))

  PRINT_D(OFFSET(student,age))

  return 0;

  }

  输出:

  sizeof(student) is 7

  OFFSET(student,sex) is 0

  OFFSET(student,score) is 1

  OFFSET(student,age) is 3

  可以看到,如果按1字节对齐,那么结构体内部的成员紧密排列,sizeof(char) == 1, sizeof(short) == 2, sizeof(int) == 4.

  修改上面的代码, 去掉#pragma pack语句,代码如下:

  #include

  #include

  #define PRINT_D(intValue) printf(#intValue" is %d\n", (intValue));

  #define OFFSET(struct,member) ((char *)&((struct *)0)->member - (char *)0)

  typedef struct

  {

  char sex;

  short score;

  int age;

  }student;

  int main()

  {

  PRINT_D(sizeof(student))

  PRINT_D(OFFSET(student,sex))

  PRINT_D(OFFSET(student,score))

  PRINT_D(OFFSET(student,age))

  return 0;

  }

  运行结果:

  sizeof(student) is 8

  OFFSET(student,sex) is 0

  OFFSET(student,score) is 2

  OFFSET(student,age) is 4