sizeof函数的一些事。

首先呢,我认为所有的话都是无力的。通过代码,我们来认识一下sizeof的一些不同的情况。

代码1:

#include "stdafx.h"
#include <iostream>
using namespace std;

class A{

private:

  double d;

  int a;

  char c;

}why;//ok 代码到此抓鸡一割。。。。。

////////////////////////////////////////

cout << sizeof(why) << endl;

//结果是多少呢?16个。。。。。呀!这是怎么回事呢?

道理其实,我也不知道,刚刚学会。。(此句拷贝别人)这是VC对变量存储的一个特殊处理。为了提高CPU的存储速度,VC对一些变量的起始地址做了“对齐”处理。在默认情况下,VC规定各成员变量存放的起始地址相对于结构的起始地址的偏移量必须为该变量的类型所占用的字节数的倍数。

其实在VC编程中,各个变量都有一定的所谓对齐方式(即变量存放的起始地址相对于地址的起始地址的偏移量)

Char
偏移量必须为sizeof(char)即1的倍数

int
偏移量必须为sizeof(int)即4的倍数

float
偏移量必须为sizeof(float)即4的倍数

double
偏移量必须为sizeof(double)即8的倍数

Short
偏移量必须为sizeof(short)即2的倍数

 

各成员变量在存放的时候根据在结构中出现的顺序依次申请空间,同时按照上面的对齐方式调整位置,空缺的字节VC会自动填充。同时VC为了确保结构的大小为结构的字节边界数(即该结构中占用最大空间的类型所占用的字节数)的倍数,所以在为最后一个成员变量申请空间后,还会根据需要自动填充空缺的字节。

接下来,有些神奇的地方,就是我发现,只要你改变变量的顺序,得到的结果会不同。你们来猜一下,到底什么原因呢?

代码:

class A

{

  char ch;

  double d;

  int  a;

}a;

sizeof(a)多少呢?

第三种情况把int调到前边会有什么不同呢?

未完待续。。。。。

 

 

posted @ 2011-10-29 00:27  a gang  阅读(439)  评论(0)    收藏  举报