sizeof问题
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




