Chinaunix首页 | 论坛 | 博客
  • 博客访问: 48553
  • 博文数量: 6
  • 博客积分: 270
  • 博客等级: 二等列兵
  • 技术积分: 65
  • 用 户 组: 普通用户
  • 注册时间: 2006-06-09 19:10
文章分类
文章存档

2011年(1)

2008年(2)

2007年(1)

2006年(2)

我的朋友
最近访客

分类:

2007-07-22 12:47:18

    什么是字节对齐,和字节为什么要对齐,计算机中内存空间都是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.数据成员、结构体和类的有效对齐值:自身对齐值和指定对齐值中小的那个值。
有了这四个规则,遇到情况我们就可以自己分析了.
阅读(1772) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~