何谓内存对齐
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访问内存要比缓存/寄存器要慢上几个数量级,为了加快执行速度,需要无所不用其极地减少随机存取次数。
内存对齐正是希望能够在一个总线周期读取完所需的数据。
内存对齐的原则
先引入一个名词:有效对齐值(对齐单位)。
内存对齐有这些原则:
- 结构体变量的首地址是有效对齐值的整数倍。
- 结构体第一个成员的偏移量(offset)为0,以后每个成员相对于结构体首地址的 offset 都是该成员大小与有效对齐值中较小那个的整数倍。
- 结构体的总大小为 有效对齐值 的整数倍
- 结构体内类型相同的连续元素将在连续的空间内,和数组一样。
- 若结构体内有结构体(或UNION),则采用其内部最大元素大小而非该结构体长度。
那么有效对齐值如何确定呢?#pragma pack ( )
指定值和结构体中最长数据类型长度 中较小的那个。
#pragma pack()
仅能指定1、2、4、8、16。
那么,一开始的例子应当理解为:4+4+8+1+7=24。