内存对齐
时间:2010-10-31 来源:xiayongchun
内存对齐
一,对齐的原因
(1):一些平台对某些特定的类型的数据的访问只能从某些特定的地址开始存取。
比如:某些架构的CPU在访问一个没有对齐的变量时会发生错误;
(2):对于没有进行内存对齐的数据的访问,存取效率低。
比如:对于一个int类型的数据,如果存放在基数地址开始的地方,就需要两个两个总线周期进行读取,还要进行拼接,效率降低。
二,实例解析
strcut MyStruct
{
double dda1;
char dda;
int type;
};
也许你认为是 sizeof(MyStruct) = 8 + 1 + 4 = 13;
VC中进行测试 sizeof(MyStruct) = 16
16是这样计算而来的 16 = 8 + 1 + 3 + 4
strcut MyStruct
{
char dda;
double dda1;
int type;
};
难道是 1 + 7 + 8 + 4 = 20 错误
是 1 + 7 + 8 + 4 + 4 = 24,呵呵你说加7还是知道怎么又加上了 4呢?怪怪!!
默认情况的规则是这样的
1:结构体的每个成员相对于结构体的首地址的偏移是该成员的整数倍(这解释了+3和+7的原因)
2:结构体的总大小为结构体中最宽基本类型的成员大小的整数倍(这解释了上面的+4的原因)
程序员如何自己设定对齐的方式呢?
使用#pramga pack(n) n = 1,2,4,16
对于
strcut MyStruct
{
char dda;
double dda1;
int type;
};
如果这样的话
#pramga pack(4)
strcut MyStruct
{
char dda;
double dda1;
int type;
};
那么 sizeof(MyStruct) = 1 +3 +8 + 4 = 16
如果改成#pramga pack(16) 结果又变回了 24
如果加上了自己的对齐的限制的话,需要取MIN(成员变量,指定的对齐的规则)
默认情况的规则是这样的需要进行扩充下是
每个成员分别按照自己的方式对齐,也就是每个成员按照其类型的对齐参数和所指定的对齐参数中较小的那个对齐,并且结构的总长度必须为所用过的所有对齐参数的整数倍(不够按照补空处理)
#pragmga pack(8)
struct S1
{
char a;
long b;
};
struct S2
{
char c;
struct S1 d;
long long e;
}
#pragmga pack()
sizeof(S2) = 24
S2的内存是 1***,1***,1111,11111111
相关阅读 更多 +