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