由于操作数的字节数在实现时可能出现变化,建议在涉及到操作数字节大小时用 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)的倍数),该成员变量