数据对齐,是指数据所在的内存地址必须是该数据长度的整数倍。比如DWORD数据的内存其实地址能被4除尽,WORD数据的内存地址能被2除尽。x86 CPU能直接访问对齐的数据,当它试图访问一个未对齐的数据时,会在内部进行一系列的调整,这些调整对于程序来说是透明的,但是会降低运行速度,所以编译器在编译程序时会尽量保持数据对齐。
C/C++编译器在内存分配时也保持了数据对齐,请看下例:
struct{
short a1;
short a2;
short a3;
}A;
struct{
long a1;
short a2;
}B;
cout<<sizeof(A)<<","<<sizeof(B)<<endl;//其它代码略去
结构体A和B的大小分别是多少呢?
默认情况下,为了方便对结构体元素的访问和管理,当结构体内的元素都小于处理器长度的时候,便以结构体里面最长的数据为对齐单位,也就是说,结构体的长度一定是最长数据长度的整数倍。
如果结构体内部存在长度大于处理器位数时就以处理器位数为对齐单位。
结构体内类型相同的连续元素将存在连续的空间内,和数组一样。
上例中:
A有3个short类型变量,各自占2字节,总和为6,6是2的倍数,所以sizeof(A)=6;
B有一个long类型变量,占4字节,一个short类型的变量,占2字节,总和6不是最大长度4的倍数,所以要补空字节以增至8实现对齐,所以sizeof(8)=8。
在C++类的设计中遵循同样的道理,但需注意,空类需要占1个字节,静态变量(static)由于在栈中分配,不在sizeof计算范围内。
posted on 2011-10-01 10:13
Yu_ 阅读(533)
评论(0) 编辑 收藏 引用 所属分类:
C/C++