Chinaunix首页 | 论坛 | 博客
  • 博客访问: 1684099
  • 博文数量: 210
  • 博客积分: 10013
  • 博客等级: 上将
  • 技术积分: 2322
  • 用 户 组: 普通用户
  • 注册时间: 2008-09-25 15:56
文章分类

全部博文(210)

文章存档

2011年(34)

2010年(121)

2009年(37)

2008年(18)

我的朋友

分类: C/C++

2010-07-07 20:52:50

先来看这个程序
 

using namespace std;
struct{
    char a1;
    int a2;
    short a3;
}A;
struct{
    int a;
    char b;
    short c;
}B;
struct{
    long b;
    int c;
    char a;
}C;
int _tmain(int argc, _TCHAR* argv[])
{
    cout<<sizeof(A)<<endl;//12

    cout<<sizeof(B)<<endl;//8

    cout<<sizeof(C)<<endl;//12

}

 

   现代计算机中内存空间都是按照byte划分的,从理论上讲似乎对任何类型的变量的访问可以从任何地址开始,但实际情况是在访问特定变量的时候经常在特定的内存地址访问,这就需要各类型数据按照一定的规则在空间上排列,而不是顺序的一个接一个的排放,这就是对齐.一些平台对某些特定类型的数据只能从某些特定地址开始存取,其他平台可能没有这种情况, 但是最常见的是如果不按照适合其平台的要求对数据存放进行对齐,会在存取效率上带来损失,比如有些平台每次读都是从偶地址开始,如果一个int型(假设为 32位)如果存放在偶地址开始的地方,那么一个读周期就可以读出,而如果存放在奇地址开始的地方,就可能会需要2个读周期,并对两次读出的结果的高低 字节进行拼凑才能得到该int数据.

  下面来分析一下c++中结构体的对齐方式,首先要明确四个概念:a.数据类型自身的对齐值,就是数据类型本身的大小;b.指定对齐值:#pragma pack (value)时的指定对齐值value.c.结构体或者类的自身对齐值:其成员中自身对齐值最大的那个值。d.数据成员、结构体和类的有效对齐值:自身对齐值和指定对齐值中较小的那个值.

 第一个结构体A,该例子中没有定义指定对齐值,在me的环境下,该值默认为4,假如从0x0000地址开始存放,a1的有效对齐值是1,占有0x0000这一个字节;a2的有效对齐值是4,必须满足x%4==0的对齐方式,所以从0x0004-0x0007地址存放a2;a3的有效对齐值是2,必须满足x%2==0的对齐方式,从0x0008-0x0009两个字节存放a3,这一共是10个字节,A自身的有效对齐值是其中数据成员的有效对齐值的最大值4,所以要按照结构体圆整的要求, 0x0009到0x0000=10字节,(10+2)%4=0,所以0x000A-0x000B两个字节也归A所有,一共是12个字节,所以sizeof(A)==12同样分析适用于BC结构体。

第二个结构体B,从0x0000开始保存,a占有0x0000-0x0003这4个字节的地址;b占有从0x0004这一个字节;c的有效对齐值是2,必须从0x0006开始存放占有0x0006-0x0007两个字节的地址,一共是8个字节,所以sizeof(B)==8;

阅读(501) | 评论(1) | 转发(0) |
0

上一篇:将数字倒置

下一篇:C++中类的大小

给主人留下些什么吧!~~

chinaunix网友2010-07-08 09:34:44

嗯 分析的还不错