内存对齐

定义

在结构或者类中,编译器为每个成员变量按照其自然边界(alignment)分配空间,各个成员变量按照它们被声明的顺序在内存中顺序存储。

目的

  1. 便于cpu快速访问
  2. 节省存储空间

方法

在缺省情况下,编译器会为每一个变量或是数据单元按其自然对界条件分配空间。也可以使用#pragma pack n伪指令设置字节对齐的数字。默认是4。

具体对齐规则:第一个成员的地址和整个结构的地址相同。后面每个成员的地址偏移量必须是n和成员的大小的最大值的整数倍。

例子

class A 
{
  int i;
  char c;
  double d;
  short s;
}

int是4个字节,char是1个字节,double是8个字节,short是2个字节。默认pack数为4。根据上面的内存对齐规则,可以算出每个成员的内存偏移量:

  • int i:第一个成员,偏移量是0;
  • char c:必须是max(4, 1) = 4的整数倍。前面成员的尾地址为4,所以偏移量为4;
  • double d:必须是max(4, 8) = 8的整数倍。前面成员的尾地址为5,所以偏移量为8;
  • short s:必须是max(4, 2) = 4的整数倍。前面成员的尾地址为16,所以偏移量为16。

内存分布情况如下:

int i char c double d short s
0-4 4-5 8-16 16-18

你可能感兴趣的:(内存对齐)