内存对齐

内存对齐

简介

C++中一个对象所占的内存大小取决于三点:所有非静态成员变量大小总和、编译器所进行的数据对齐而添加的填充的大小、为支持虚函数、虚继承所产生的额外负担。其中编译器会为结构体进行对齐,从而往其中加上一些并不会使用的空间,那么我们为什么需要进行内存对齐呢,其原因大致有两个,一个是平台原因,因为并不是所有的硬件平台都能访问任意地址上的任意数据的,某些硬件平台只能在某些地址处取出某些特定类型的数据,否则会抛出硬件异常;另一个是性能原因,因为为访问未对齐的内存时,CPU可能为了取出数据进行多次内存的读取操作,效率较低。

内存对齐规则

  • 对于结构体的各个成员,第一个成员为偏移为0的位置,以后每个数据成员的偏移量必须是min(#pragma pack指定值,这个数据成员自身长度)的倍数
  • 所有数据成员各自完成对齐后,结构体或联合体自身也需要对齐,因为可能有结构体构造的数组(数组中也需每个元素维持上一条性质),对齐会按照#pragma pack指定的数值和结构体或联合体最大数据成员长度中比较小的那个进行对齐