内存对齐的一点笔记

Posted on 2018-05-10 15:16:05

何谓内存对齐

using test = struct {
    int a;
    double b;
    char c;
};

请问sizeof(test)是多少?
很简单,4+8+1=…….13吗?

在我的g++ (Ubuntu 5.5.0-12ubuntu1~16.04) 5.5.0 20171010 中,结果是8+8+8=24。

这就是内存对齐。

为何内存对齐

我们知道,CPU访问内存要比缓存/寄存器要慢上几个数量级,为了加快执行速度,需要无所不用其极地减少随机存取次数。
内存对齐正是希望能够在一个总线周期读取完所需的数据。

内存对齐的原则

先引入一个名词:有效对齐值(对齐单位)。
内存对齐有这些原则:

  1. 结构体变量的首地址是有效对齐值的整数倍。
  2. 结构体第一个成员的偏移量(offset)为0,以后每个成员相对于结构体首地址的 offset 都是该成员大小有效对齐值较小那个整数倍
  3. 结构体的总大小为 有效对齐值整数倍
  4. 结构体内类型相同的连续元素将在连续的空间内,和数组一样。
  5. 若结构体内有结构体(或UNION),则采用其内部最大元素大小而非该结构体长度。

那么有效对齐值如何确定呢?
#pragma pack ( )指定值和结构体中最长数据类型长度 较小的那个

#pragma pack()仅能指定1、2、4、8、16。

那么,一开始的例子应当理解为:4+4+8+1+7=24。