2008北京奥运/残奥会 | 首页 | 论坛 | 新闻 | 相册 | 圈子 | 博客 | 网店 | 考研 | FTP | WAP | 游戏 | 竞猜 | 同济网博客群 | 添加到收藏夹 | RSS 订阅全部版块
同济闲话 | 朝夕问道 | 同舟共济 | 就业与实习 | 置换信息 | 高考招生 | 文艺天地 | 大众影像 | 同济之痒 | 德国留学 | 情感空间 | 旅游户外 | 校园布告栏 | 原创艺术与设计
选课交流 | 汗青简牍 | 外语学习 | 欧美澳留学 | 影音天地 | 大一生活 | 兼职快报 | 动漫家园 | 游戏人生 | 体育动力 | 精致生活 | 吃在同济 | 上班族 | 土木建筑 | 万有科学
同济社团 | 科幻 | 街舞 | 武术 | 吉他 | 竹笛 | 网球 | 棒垒球 | 职业发展 | 辩论演讲 | 轮滑滑板 | 古典乐韵 | 合唱团



同济网新闻 NEWS.TONGJI.NET| 同济网团队招募| 同济鹊桥,LOVE.TONGJI.NET



现在,潜水的你也能表达立场,还有同钱随便领 | [竞猜吧]-[小游戏] | 在本论坛刊登广告
学习工作信息区 | 生活信息区 | 学习学术区 | 生活娱乐区 | 社团活动 | 学院讨论 | 版务管理
发新话题
打印

[软件] 关于一个struct的问题

关于一个struct的问题  ※ 来源: 同济网论坛 BBS.TONGJI.NET

struct   MyBitType   
  {   
          char     a:1;   
          unsigned   int   b:1;   
          unsigned   int   c;   
          int   d;   
  };
的sizeof(MyBitType)到底是如何计算的。没有冒号初始化的时候是16,全部用冒号初始化为4,一部分的时候又为8............



Tongji.ASIA,中国高校首个.ASIA亚洲域名邮箱开放注册 | 同济大学2008大一新生签名报道贴
只能提到 有的机器 要注意 字节对齐问题(比如四字节对齐)

冒号初始化的情况不知道


上边那个是在同一台机器上的,使用dev-cpp+Mingw编译的,没有冒号的时候加上对齐就是16个字节,但是后边的就迷糊了....


你 不要写  1 ,
写  几千几万看看报什么错 ,可能你就能了解些什么信息。


我用的是标准的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 编辑 ]


本帖最近评分记录
  • 真木 积分 +20 嗯,很专业很具体的解释 2008-5-6 16:19

TopCoder + Googler + MSer高手要保持低调
长见识了……
膜拜LS神牛



The Lord will go with us.
Dear Mr. Hacker_QC:

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吧?


本帖最近评分记录
  • 真木 积分 +1 :) 2008-5-19 09:44
  • 真木 同钱 +1 :) 2008-5-19 09:44

如果有一款新的CPU, 而且是新的指令系统, 如何在第一时间使用他?
熟悉该CPU的硬件构架和指令系统->用机器码进行编程实验并慢慢熟悉->用助记符来代替机器码以提高可读性->用助记符来完成一些小模块以挖掘该款CPU指令的精髓->用更简单易懂的语法来实现这些小模块。
由此可见,在人类与CPU打交道的过程中,编译器的作用是多么重要?
内核贵在资源管理模式的构思和数据结构使用的精巧,可以说,他使用高级语言谱写优美的文章。
而编译器则体现了细致入微,一丝不苟的严谨。稳定,准确,高效,坚韧不拔。翻译一句话不难,但是要把所有的信息都准确无误的翻译后表达给CPU,这决非易事。
所以我认为,研究编写内核的人是一个管理者和优秀的代码员。
研究编译器的人则更似开拓者和坚毅的运动员。
我怎么觉得最后一句话"一部分冒号的时候"应该是12?(32位机器)

刚看到5#,嗯,解释的很清楚,不重复了



引用:
原帖由 oscar 于 2008-5-17 08:22 发表
Dear Mr. Hacker_QC:

sorry,有一个地方似乎有些笔误:

-------------------------------------------------------------------开始引用 Hacker_QC原文----------------------------------------------------- ...
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 编辑 ]



TopCoder + Googler + MSer高手要保持低调
赞5#



※ 本贴中一切内容均为发帖帐号所有人自行发布,同济网不承担任何法律及道德责任。
   ‹‹ 上一主题 | 下一主题 ››


发新话题


同济大学  - 同济网Tongji.Net  - 同济大学论坛  - 同济大学BBS  - 同济论坛  - 同济BBS  - 同济大学博客  - 同济大学BLOG  - 同舟共济