我用的是标准的GCC的编译器,我得到的结果是:
对于第一种情况:
struct MyBitType {
char a;
unsigned int b;
unsigned int c;
int d;
};
sizeof(MyBitType)的结果是 16;
对于第二种情况:
struct MyBitType {
char a:1;
unsigned int b:1;
unsigned int c;
int d;
};
sizeof(MyBitType)的结果是 12;
对于第三种情况:
struct MyBitType {
char a:1;
unsigned int b:1;
unsigned int c:1;
int d:1;
};
sizeof(MyBitType)的结果是 4;
先解释第一种情况:
首先,在计算机组成原理课的时候有说到,计算机为了效率考虑,会将2字节的变量放在整数地址开始的位置,会将4字节的变量放在整除4的起始地址位置。所以,第一种情况,MyBitType在内存中的位置会是这样:
第一个字节是char a, 后3个字节空出,第5到8字节为 unsigned int b, 第9到12字节为unsigned int c,第13到16字节为int d。 (注意: unsigned int b 的大小为4字节,所以必须在char a 后面空出3个byte,然后开始存放 unsigned int b)。这样,总地址大小为 16字节。
第二种情况:
首先要解释变量名后面的那个":"是什么意思:冒号后面的数指定了此成员变量所占的字节数。所以此时的struct中: a:1 byte, b: 1byte, c: 4 byte, d: 4 byte.
同样考虑到对齐的问题:a 和 b 直接存放到第一和第二个字节处,而c为4字节,所以要从空出2个字节位,从第5位开始,既此struct的内存情况是: 0位: a, 1位: b, 2-3位: 空, 4-8位: c, 9-12位: d ,总需要12个字节,故sizeof(MyBitType)=12
第三种情况:
每个变量都是1字节大小,所以每个占1字节,总共需要4字节,而4字节刚好是机器的一个字长,不需要再对齐,所以 sizeof(MyBitType) = 4.
最后要注意,指定了成员变量的字节大小后,能表示的范围要相应变化,比如第三种情况里面的 a, b, c, d都必须是 1字节的范围, (0~255).
推荐一个网页:
http://www.cs.cf.ac.uk/Dave/C/node13.html (see "Bit Fields")
[
本帖最后由 Hacker_QC 于 2008-5-21 06:47 编辑 ]