计算机的内存分配问题

内存对齐原则

什么是内存对齐
计算机的内存都是按byte来划分的,计算机在范围不同数据类型变量时会按照特定的内存地址访问,所以各种数据类型会按照一定规则在内存空间上排列,而不是顺序地一个一个排列,这就是内存对齐

有什么用
各平台对数据类型的读取会按特定的地址开始存取,访问不对齐的内存处理器需要做两次处理,访问对齐的内存处理器只需要做一次处理

对齐算法

1 数据类型以自身需要占用的字节数做为内存对齐值。

对于char型数据,其自身对齐值为1,对于short型为2,对于int,float型,其自身对齐值为4,对于double型,其自身对齐值为8,单位字节。

例如:int变量所分配的内存地址必须能够被4整除,double则必须能倍8整除

2 结构体或类自身的对齐值和自身成员变量对齐值最大的那个保持一致。

1
2
3
4
5
6
7
例如:
struct D {
char a;
int b;
double c;
}

结构D的成员变量里c的对齐值最大为8,所以结构D的对齐值就是8

3 指定对齐值,使用#pragma pack (value)可以指定对齐值为Value

1
2
3
4
5
6
7
8
例如:
#pragma pack (1) // 指定对齐值为1
struct D {
char a;
int b;
double c;
}
#pragma pack () // 取消指定对齐,恢复默认的对齐方式

4 当数据成员、结构体、类处于指定对齐区间时,真实的有效对齐值是自身对齐值和指定对齐值两个中更小的那个。

内存对齐百科

Blacktea wechat
ex. subscribe to my blog by scanning my public wechat account
记录生活于感悟,您的支持将鼓励我继续创作!