学习 2018 年 3 月 21 日

结构体对齐

记录结构体对齐对内存优化的笔记

修改结构体对齐大小

#pragma pack(8)   //对齐参数默认为8,可修改8改变对齐大小
strunct align
{
  char a;
  short b;
  int c;
  double d
}
#pragma pack
结构体对齐大小默认大型设置:项目右键→setting→C/C++→Code Generation

对齐原则

  • 数据成员对齐规则:结构的数据成员,第一个数据成员放在offset为0的地方,以后每个数据成员存储的起始位置要从该成员大小的整数倍开始(比如int在32位中为4字节,则要从4的整数倍地址开始存储)
  • 结构体的总大小,也就是sizeof的结果,必须是其内部最大成员的整数倍,不足的用0补齐
  • 如果一个结构里有某些结构体成员,则结构体成员要从其内部最大元素大小的整数倍地址开始存储(struct a 里存有一个 struct bb里有charintdouble等元素,那b应该从8的整数倍开始存储)
  • 对齐参数如果比结构体成员的sizeof值小,该成员的偏移应该以此值为准,也就是说,结构体成员的偏移量应该取二者的最小值

总结

定义结构体时按照数据类型由小到大的顺序进行书写,能避免内存空间浪费。