background image

  由于操作数的字节数在实现时可能出现变化,建议在涉及到操作数字节大小时用 sizeof 来代替常量
计算。
  本文主要包括二个部分,第一部分重点介绍在 VC 中,怎么样采用 sizeof 来求结构的大小,以及容
易出现的问题,并给出解决问题的方法,第二部分总结出 VC 中 sizeof 的主要用法。

1

 

、 sizeof 应用在结构上的情况

  请看下面的结构:

struct MyStruct

{

double dda1;

char dda;

int type

};

  对结构 MyStruct 采用 sizeof 会出现什么结果呢?sizeof(MyStruct)为多少呢?也许你会这样求:

sizeof(MyStruct)=sizeof(double)+sizeof(char)+sizeof(int)=13

  但是当在 VC 中测试上面结构的大小时,你会发现 sizeof(MyStruct)为 16。你知道为什么在 VC 中会得
出这样一个结果吗?
  其实,这是 VC 对变量存储的一个特殊处理。为了提高 CPU 的存储速度,VC 对一些变量的起始地

址做了 对齐 处理。在默认情况下,VC 规定各成员变量存放的起始地址相对于结构的起始地址的偏移
量必须为该变量的类型所占用的字节数的倍数。下面列出常用类型的对齐方式(vc6.0,32 位系统)。
  类型
  对齐方式(变量存放的起始地址相对于结构的起始地址的偏移量)
  Char
  偏移量必须为 sizeof(char)即 1 的倍数
  int
  偏移量必须为 sizeof(int)即 4 的倍数
  float
  偏移量必须为 sizeof(float)即 4 的倍数
  double
  偏移量必须为 sizeof(double)即 8 的倍数
  Short
  偏移量必须为 sizeof(short)即 2 的倍数
  各成员变量在存放的时候根据在结构中出现的顺序依次申请空间,同时按照上面的对齐方式调整位
置,空缺的字节 VC 会自动填充。同时 VC 为了确保结构的大小为结构的字节边界数(即该结构中占用最
大空间的类型所占用的字节数)的倍数,所以在为最后一个成员变量申请空间后,还会根据需要自动填
充空缺的字节。
  下面用前面的例子来说明 VC 到底怎么样来存放结构的。

struct MyStruct

{

double dda1;

char dda;

int type

};

  为上面的结构分配空间的时候,VC 根据成员变量出现的顺序和对齐方式,先为第一个成员 dda1 分
配空间,其起始地址跟结构的起始地址相同(刚好偏移量 0 刚好为 sizeof(double)的倍数),该成员变量