CSDN首页 空间 新闻 论坛 Blog 下载 读书 网摘 搜索 .NET Java 视频 接项目 求职 在线学习 买书 程序员 通知
可用分押宝游戏火热进行中... 专题改版:Java Web 专题
CSDN社区
搜索 收藏 打印 关闭
CSDN社区 >  C/C++ >  C++ 语言

发觉VC++编译器一个严重的错误,请大侠们解释。

楼主IamScout(侦察员)2003-11-03 11:49:55 在 C/C++ / C++ 语言 提问

//小弟有以下一段程序,发觉输出的结果不同,不知是编译器的问题,还是别的原因,恳请大侠们解答。  
  #include<iostream.h>  
  class   compel  
  {  
  private:  
                    char   aa[100];  
  int   a;  
  double   b;  
  };  
  class   compel2  
  {  
  private:  
                    char   aa[100];  
  double   b;  
  int   a;  
  };  
  int   main()  
  {  
  cout<<"compel="<<sizeof(compel)<<endl;  
  cout<<"compel2="<<sizeof(compel2)<<endl;  
   
  return   0;  
  } 问题点数:100、回复次数:18Top

1 楼rtdb(东临碣石)回复于 2003-11-03 12:12:48 得分 10

是字节对齐导致的输出不同。  
   
  下次请不要用“发觉VC++编译器一个严重的错误”这种标题。  
  Top

2 楼kngpm584(飞翔的野蛮人)回复于 2003-11-03 12:13:16 得分 20

这不是编译器出了问题,而是结构体内部数据成员对齐不同造成的差别。不妨参阅msdn,在查询中输入#pragma,再找pack。Top

3 楼houdy(致力于图像/图形领域,成为有思想的程序员)回复于 2003-11-03 12:22:54 得分 5

以上正解,可以结贴了。。。Top

4 楼fierygnu(va_list)回复于 2003-11-03 12:35:36 得分 1

呵呵,吓了一跳。Top

5 楼shishiXP(诗人XP)回复于 2003-11-03 12:39:33 得分 1

接分   !Top

6 楼flyelf(空谷清音)回复于 2003-11-03 13:05:21 得分 1

upTop

7 楼leyt(思维机器)回复于 2003-11-03 13:17:00 得分 1

吓了一小跳,原来虚惊一场Top

8 楼eboson(无境阁主)回复于 2003-11-03 13:18:45 得分 1

 
  标题挺能吸引眼球Top

9 楼bing_huo(我是一个演员!)回复于 2003-11-03 13:20:34 得分 1

upTop

10 楼williamVII(spread)回复于 2003-11-03 13:29:30 得分 9

建议楼主去看一下<Inside   C++   Object   Model>  
  好像是第三章开头就说了.Top

11 楼Bandry(菜鸟-舍我其谁)回复于 2003-11-03 13:44:16 得分 1

楼主搞清楚再说,还发现×××了,有问题就提,没必要搞这种标题,哗众取宠!Top

12 楼yjh1982(血精灵)回复于 2003-11-03 13:45:02 得分 1

唉Top

13 楼Wolf0403(废人:独活十年~心如刀割)回复于 2003-11-03 13:51:45 得分 1

是不是新人都喜欢一惊一诈?呵呵。前面   n   多帖子讨论过这个问题了,建议斑竹删帖示警。  
   
  关于内存对齐,老大应该整理一个专题或者精华出来了,呵。最近研究这个的很多嘛Top

14 楼jeckyz(深圳)回复于 2003-11-03 13:55:29 得分 20

字节对齐是根本原因,不同的编译输出的结果也不大一样(在默认选项下),不过根本上还是会遵循字节对齐规则.   在VC环境下,非抽象的空类大小为   1(C++标准如此),如  
   
  class   A   {   };  
  class   B   {   };  
  class   C   :   A,   B   {   };  
   
  你试着用   g++,   BC,   VC   作个比较   :),   对结果不要太惊讶.其实你刻意去改动对齐方式,结果也不一样,你也可以尝试以   1,   2,   4,   8,   16     看看.Top

15 楼Hot_Forever(用钱砸死我吧)回复于 2003-11-03 14:13:41 得分 20

试着分析一下:  
  第一个sizeof=112没啥可说的,100个char=100+1个int=104+1个double=112  
  第二个还是比较有意思的  
  因为按照一般的理解,应该是char[100]=100,1个double=8,然后底下的int和上面对齐,也等于8,于是应该是116  
  ,不过VC比较怪,它上面的char[100]分配了104个字节,为啥呢,我觉得是一开始4个4个4个  
  然后到最后了还剩4个了,要和下面的8个字节的double对齐,又补了4个,于是结果居然是  
  120,呵呵  
  我想这个具体编译器的实现有关了,  
  我在DEV-C++和CBuilder5下结果同上Top

16 楼jeckyz(深圳)回复于 2003-11-03 14:15:15 得分 5

其实项目开发的时候很容易出现这种问题的,特别是进行数据处理的时候.大家可能都只用C++(更贴切地说或者是只用VC),   假如是在一个运用多种语言多人合作的开发项目的   project   team   里面,如果这种事情出现在自己身上,可真算丢人.我就有过这样的经历,   当时我是用C++来解释其他人用   delphi   做的数据,他们一个   byte   不差地把数据做好了,   然而我在   EVC   里用结构来处理它们,好像一切很好,但最终是打开内存监视一个   byte   一个   byte   刻对才知道症结所在,真可谓记忆犹新!  
   
  Top

17 楼lovenoend(有容乃大)回复于 2003-11-06 18:20:07 得分 1

UpTop

18 楼qufan(打死不回头)回复于 2003-11-06 21:51:21 得分 1

upTop

相关问题

  • 编译器错误
  • 编译器错误??????
  • VBScript 编译器错误
  • 编译器小错误
  • VC 编译器LINK时出了一个奇怪的错误,请大家帮忙
  • vc++编译器的问题
  • VC编译器的问题
  • VC++6.0编译器问题.......
  • vc编译器死机
  • VC编译器的提问

关键词

  • c++
  • 编译器
  • vc
  • 结果
  • double
  • 问题
  • 应该
  • byte
  • char

得分解答快速导航

  • 帖主:IamScout
  • rtdb
  • kngpm584
  • houdy
  • fierygnu
  • shishiXP
  • flyelf
  • leyt
  • eboson
  • bing_huo
  • williamVII
  • Bandry
  • yjh1982
  • Wolf0403
  • jeckyz
  • Hot_Forever
  • jeckyz
  • lovenoend
  • qufan

相关链接

  • C/C++ Blog
  • C/C++类图书
  • C/C++类源码下载

广告也精彩

反馈

请通过下述方式给我们反馈
反馈
提问
网站简介|广告服务|VIP资费标准|银行汇款帐号|网站地图|帮助|联系方式|诚聘英才|English|问题报告
世纪乐知(北京)网络技术有限公司 版权所有, 京 ICP 证 020026 号
北京创新乐知广告有限公司 提供技术支持
Copyright © 2000-2007, CSDN.NET, All Rights Reserved
GongshangLogo