CSDN首页 空间 新闻 论坛 Blog 下载 读书 网摘 搜索 .NET Java 视频 接项目 求职 在线学习 买书 程序员 通知
花落谁家,你作主! 盛大widget设计大赛英雄榜
CSDN社区
搜索 收藏 打印 关闭
CSDN社区 >  VC/MFC >  基础类

sizeof问题

楼主moisse(湖月照我影)2001-06-26 15:47:22 在 VC/MFC / 基础类 提问

June.26.2001  
  source   code:  
   
  typedef   unsigned   char               BYTE;  
  typedef   struct  
  {  
        unsigned   long       Total;          
        unsigned   long       Command_ID;            
        unsigned   long       SeqID;          
  }MESSAGE_HEADER,*P_MESSAGE_HEADER;  
   
   
  typedef   struct  
  {  
        MESSAGE_HEADER     message_head;  
        unsigned   char     Addr[6] ;    
        unsigned   char     Auth[16]   ;      
        char     Reverse[8];          
  }TR_CONNECT,*P_TR_CONNECT;                                      
   
  typedef   struct  
  {      
  }TR_TERMINATE_REP,*P_TR_TERMINATE_REP;                                        
   
  typedef   struct  
  {    
        unsigned   long     Msg_Id;        
          BYTE       Tls;        
          BYTE       Result;          
  }TR_SUBMIT_REP,*P_TR_SUBMIT_REP;  
   
  typedef   struct  
  {    
  unsigned   long         Msg_id;        
          char       Stat[7];      
          char       Submit[10];  
          char       Done[10];      
  }MSG_CONTENT,*P_MSG_CONTENT;  
   
  typedef   struct  
  {    
        unsigned   long       Msg_Id;      
          BYTE         Tls_;  
          BYTE         Result;    
  }TR_DELIVER_REP,*P_TR_DELIVER_REP;  
   
   
  typedef   struct  
  {    
  MESSAGE_HEADER   message_head;  
  unsigned   long       Msg_Id;        
          BYTE         Tls;//是否使用TLS协议层  
  }TR_CANCEL,*P_TR_CANCEL;  
   
  typedef   struct  
  {    
  MESSAGE_HEADER   message_head;  
  unsigned   char         Tls;    
  }TR_ACTIVE_TEST,*P_TR_ACTIVE_TEST;  
   
  //test   size   end  
  main()  
  {  
                cout<<"MESSAGE_HEADER   size   is   :   "<<sizeof(MESSAGE_HEADER)<<endl;  
                cout<<"TR_CONNECT   size   is   :   "<<sizeof(TR_CONNECT)<<endl;//44(42)  
                cout<<"TR_TERMINATE_REP   size   is   :   "<<sizeof(TR_TERMINATE_REP)<<endl;//1(0)  
                cout<<"TR_SUBMIT_REP   size   is   :   "<<sizeof(TR_SUBMIT_REP)<<endl;//8(6)  
   
  cout<<"MSG_CONTENT   size   is   :   "<<sizeof(MSG_CONTENT)<<endl;//32(31)  
  cout<<"TR_DELIVER_REP   size   is   :   "<<sizeof(TR_DELIVER_REP)<<endl;//8(6)  
   
  cout<<"TR_CANCEL   size   is   :   "<<sizeof(TR_CANCEL)<<endl;//20(17)  
  cout<<"TR_ACTIVE_TEST   size   is   :   "<<sizeof(TR_ACTIVE_TEST)<<endl;//16(13)  
  }  
   
  后面注释中的为打印结果,括号里的是应该的结果。有谁知道为什么? 问题点数:20、回复次数:16Top

1 楼plato(天天)回复于 2001-06-26 15:55:47 得分 10

每个成员都按照4字节对齐了Top

2 楼plato(天天)回复于 2001-06-26 15:56:52 得分 0

TR_TERMINATE_REP成员为空,编译器强行加了一个字节Top

3 楼liu_feng_fly(笑看风云 搏击苍穹 衔日月)回复于 2001-06-26 16:01:30 得分 0

推荐《深入探索c++对象模型》,那上面讲的很详细,还有很多有用的东西  
  同意楼上的意见Top

4 楼moisse(湖月照我影)回复于 2001-06-26 16:07:01 得分 0

如果我一定要得到真实的值怎么办?  
  那里有电子版《深入探索c++对象模型》down?Top

5 楼moisse(湖月照我影)回复于 2001-06-26 16:15:03 得分 0

????????/Top

6 楼plato(天天)回复于 2001-06-26 16:16:59 得分 0

什么叫真实的值?sizeof不是真实的值吗?Top

7 楼ForApply(冷静燃烧)回复于 2001-06-26 16:18:50 得分 0

sizeof()取到的是完全真实的值!Top

8 楼moisse(湖月照我影)回复于 2001-06-26 16:25:42 得分 0

当然不是。如果  
  BYTE   arr[44];  
  P_TR_CONNECT   p_TR_CONNECT=new   TR_CONNECT;  
  memcpy(arr,(char   *)p_TR_CONNECT,44);  
  那么arr[18],arr[19]是什么?Top

9 楼plato(天天)回复于 2001-06-26 16:32:10 得分 0

你这样写,就对编译器做了假设:假设它是以单字节对齐的,C标准可没有这个规定。  
  你应该这样写:  
   
  BYTE   arr[sizeof(TR_CONNECT)];  
  P_TR_CONNECT   p_TR_CONNECT=new   TR_CONNECT;  
  memcpy(arr,(char   *)p_TR_CONNECT,sizeof(TR_CONNECT));  
   
  OK?  
  Top

10 楼moisse(湖月照我影)回复于 2001-06-26 16:35:42 得分 0

BYTE   arr[sizeof(TR_CONNECT)];  
  有问题,怎么能动态建立数组,编译通不过  
  Top

11 楼plato(天天)回复于 2001-06-26 16:36:41 得分 0

sizeof(TR_CONNECT)是常量,编译时确定的,你试试看Top

12 楼hello008(paladin)回复于 2001-06-26 16:41:28 得分 10

VC菜单-》工程》设置》C/C++》Code   Generation》8Bytes改成1Byte就可以得到真实的大小  
  sizeof是为结构分配的内存空间的大小。Top

13 楼moisse(湖月照我影)回复于 2001-06-26 16:55:22 得分 0

hello008(paladin)的想法是对的,不过这样子作显著降低了执行性能(尤其对奔腾以上):(  
  sizeof(TR_CONNECT)是常量,编译时的确可以通过   :)Top

14 楼ForApply(冷静燃烧)回复于 2001-06-27 00:04:00 得分 0

to   moisse(秋水):  
        胡扯,sizeof()得到的就是结构实际的大小,和系统分配的大小无关,具体用的时候,系统按照对齐方式填充,也就是说,不管结构是多大,sizeof都取到字节长度的和  
  例如:  
  struct   no  
  {  
        char   cOne;  
  };  
    不管几字节对齐,sizeof都是1  
    但是系统在分配内存的时候是按照对齐方式分配的,包括引用指针都是的  
   
  就这么多,,建议你试试看,你就知道了!Top

15 楼moisse(湖月照我影)回复于 2001-06-27 10:17:19 得分 0

废话,sizeof(no)当然为1,只有一个成员,谈什么对齐;  
  你可以试一试:  
  typedef   struct  
  {  
          char       Command_ID;      
          long       Total_Length;          
  }TEST_HEADER;  
  编译时:#pragma   pack(1)   sizeof(TEST_HEADER)=5;  
                #pragma   pack(2)   sizeof(TEST_HEADER)=6;  
                #pragma   pack(4)   sizeof(TEST_HEADER)=8;  
  你的话讲得不够清楚!到底你想讲什么。  
   
   
  Top

16 楼moisse(湖月照我影)回复于 2001-06-27 10:21:32 得分 0

补充:  
    默认时(#pragma   pack(8)),以占最大空间的那个内置类型的成员为基准对齐  
  :   比如:  
  :   struct   A  
  :   {  
  :       int   x   ;  
  :       char   a   ;  
  :       char   b  
  :   }   ;  
  :   sizeof(A)   是   8  
  :    
  :   struct   B  
  :   {  
  :       __int64   x   ;   //   MS   Specific   支持这个内置类型,   64位的整数  
  :       char   a   ;  
  :       char   b  
  :   }   ;  
  :   sizeof(B)   是   16  
  :   Top

相关问题

  • sizeof
  • sizeof()
  • sizeof(a)/sizeof(int)
  • sizeof(char*)
  • sizeof(struct)?
  • sizeof(struct)及sizeof(class)
  • sizeof(1.234)=8 sizeof(float)=4???
  • 请教 sizeof(struct a)?
  • Sizeof的问题
  • 关于SIZEOF?

关键词

  • rep
  • tls
  • typedef struct
  • unsigned long
  • tr
  • msg
  • header
  • submit
  • message
  • unsigned

得分解答快速导航

  • 帖主:moisse
  • plato
  • hello008

相关链接

  • Visual C++类图书
  • Visual C++类源码下载

广告也精彩

反馈

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