Chinaunix首页 | 论坛 | 博客
  • 博客访问: 1608275
  • 博文数量: 245
  • 博客积分: 10378
  • 博客等级: 上将
  • 技术积分: 2571
  • 用 户 组: 普通用户
  • 注册时间: 2009-03-27 08:19
文章分类

全部博文(245)

文章存档

2013年(4)

2012年(8)

2011年(13)

2010年(68)

2009年(152)

分类: C/C++

2009-09-01 11:23:14

 在C语言中,有关存储的问题会设计到一些对齐概念的理解,我们知道,为了能使CPU对变量进行高效快速的访问,变量的起始地址应该具有某些特性,即所谓的“对齐”。例如对于4字节的int类型变量,其起始地址应位于4字节边界上,即起始地址能够被4整除。变量的对齐规则如下(32位系统):

char  在字节边界上对齐

short (16-bit)   在双字节边界上对齐

int and long (32-bit)  在4字节边界上对齐

float   在4字节边界上对齐

double   在8字节边界上对齐

这里纯粹是为了计算机存储方便设计的,在设计到对齐概念时,只需要理解存储单元的首地址必须能够和该存储类型变量的对齐方式整除,例如:  存储int型,sizeof(int)=4.,所以地址必须要能够被4整除,这个问题在结构体占用存储单元大小计算的时候会用到:

比如:


struct
{
  int a;
  char b;
  int c;
}test;
sizeof(test)=?

结果是12,这就是对齐的概念,

再看下边几个:


struct
{
    char a;
    int c;
    float d;
    char e;
    double f;
}test;

sizeof(test)=?

结果是24,

这里需要注意的一个问题是:

对于double型的数据也是字对齐,可以这么理解虽然double占用2个字(dw),即8个字节(byte),但它的对齐方式仍然是字对齐,只是在存储空间上需要占用8个字节的空间,

也可以这么理解,在对齐方式中,只有字节对齐、半字对齐、字对齐三种方式,double属于字对齐,float、int也属于字对齐。

阅读(1394) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~