什么是字节对齐,和字节为什么要对齐,计算机中内存空间都是byte分的,照理应该可以对任何类型的变量的访问都可以从任意地址开始,但实际情况是在访问特定变量的时候经常在特定的内存地址访问,这就需要各种类型数据按照一定规则在空间上排列,而不是按照顺序的一个接一个的排列,这就是对齐。
对齐的作用和原因:各种硬件平台对存储空间的处理方式有很大的不同,一些平台对某些特定类型的数据只能从某些特定地址开始存取。其他平台可能没有这种情况,但是最常见的是如果不按照适合其平台要求对数据存放进行对齐,会在存取效率上带来损失。比如有些平台每次读都是从偶地址开始,如果一个int型(假设为32位系统)如果存放在偶地址开始的地方,那么一个读周期就可以读出,而如果存放在奇地址开始的地方,就可能会需要2个读周期,并对两次读出的结果的高低字节进行拼凑才能得到该int数据。显然在读取效率上下降很多。一般的情况下,我们在编码的时候不需要考虑这些,编译器会帮我们去选择适合的目标平台的对齐策略。当然,我们也可以用#pragma pack (length)来改变对齐方式。但正是由于编译器帮我们处理了,而我们自己又了解的话,往往会感到有些迷惑。struct数据结构是比较常见的,经常看到论坛上对于struct 数据结构的sizeof结果值问题.为此首先我们必须对字节对齐算法有所了解.(32位机平台)
struct _A
{
char a;
int b;
short c;
};
结构体_A中包含了1字节长度的char一个,4字节长度的int一个和2字节长度的short型一个,本来按理应该只用到7个字节.但是因为编译器要对数据成员在空间上进行对齐.
所以sizeof(struct _A) 的值是12;
而
struct _A
{
int b;
char a;
short c;
};
的sizeof(struct _A) 的值是却是8;
下面我们对结构体进行指定长度对齐:
#pragma pack (1)/*指定按1字节对齐*/
struct _A
{
char a;
int b;
short c;
};
#pragma pack ()/*取消指定对齐*/
sizeof(struct _A) 的值是7;
#pragma pack (2)/*指定按2字节对齐*/
struct _A
{
char a;
int b;
short c;
};
#pragma pack ()/*取消指定对齐*/
sizeof(struct _A) 的值是8;
对于char型数据,其自身对齐值为1,对于short型为2,对于int,float,double类型,其自身对齐值为4,单位字节。
这里面有四个规则:
1.数据类型自身的对齐值:就是上面交代的基本数据类型的自身对齐值。
2.指定对齐值:#progma pack (value)时的指定对齐值value。
3.结构体或者类的自身对齐值:其成员中自身对齐值最大的那个值。
4.数据成员、结构体和类的有效对齐值:自身对齐值和指定对齐值中小的那个值。
有了这四个规则,遇到情况我们就可以自己分析了.
阅读(1803) | 评论(0) | 转发(0) |