对于第一种情况:
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
-------------------------------------------------------------------开始引用 Hacker_QC原文-------------------------------------------------------------------------------
先解释第一种情况:
首先,在计算机组成原理课的时候有说到,计算机为了效率考虑,会将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个bit,然后开始存放 unsigned int b)。这样,总地址大小为 16字节。
------------------------------------------------------------------- 结束引用 Hacker_QC原文-----------------------------------------------------------------------------
bit 应为byte吧?
smarthhx (2008-5-17 12:13:44)
我怎么觉得最后一句话"一部分冒号的时候"应该是12?(32位机器)
刚看到5#,嗯,解释的很清楚,不重复了
Hacker_QC (2008-5-21 06:49:11)
QUOTE:
原帖由 oscar 于 2008-5-17 08:22 发表
Dear Mr. Hacker_QC:
Yes, my carelessness. The "bit" in my thread should be "byte". Actually, the unit used in memory will always be "byte". I've updated my previous thread.
最新回复
真木 (2008-4-28 00:27:05)
冒号初始化的情况不知道
xxx8611 (2008-4-28 13:11:20)
真木 (2008-4-28 17:48:27)
写 几千几万看看报什么错 ,可能你就能了解些什么信息。
Hacker_QC (2008-5-06 05:25:06)
对于第一种情况:
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 编辑 ]
shek (2008-5-09 22:23:21)
膜拜LS神牛
oscar (2008-5-17 08:22:54)
sorry,有一个地方似乎有些笔误:
-------------------------------------------------------------------开始引用 Hacker_QC原文-------------------------------------------------------------------------------
先解释第一种情况:
首先,在计算机组成原理课的时候有说到,计算机为了效率考虑,会将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个bit,然后开始存放 unsigned int b)。这样,总地址大小为 16字节。
------------------------------------------------------------------- 结束引用 Hacker_QC原文-----------------------------------------------------------------------------
bit 应为byte吧?
smarthhx (2008-5-17 12:13:44)
刚看到5#,嗯,解释的很清楚,不重复了
Hacker_QC (2008-5-21 06:49:11)
QUOTE:
First of all, thanks for your review.Yes, my carelessness. The "bit" in my thread should be "byte". Actually, the unit used in memory will always be "byte". I've updated my previous thread.
[ 本帖最后由 Hacker_QC 于 2008-5-21 06:57 编辑 ]
jordah34 (2008-6-15 16:04:10)