首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > C++ >

关于字节对齐,该怎么处理

2012-04-16 
关于字节对齐typedef struct _tag_CommonIdCmd_struct{BYTE Cmd_CodeBYTE Sub_IdWORDSub_Cmd}CommonIdC

关于字节对齐
typedef struct _tag_CommonIdCmd_struct
{
BYTE Cmd_Code;
  BYTE Sub_Id;
WORD Sub_Cmd;

}CommonIdCmd;

typedef struct _tag_QureyVer
{
CommonIdCmd Cmd;  
BYTE cStatus;
_tag_QureyVer()
{
Cmd.Cmd_Code = 75;
Cmd.Sub_Id = 201;
Cmd.Sub_Cmd = 0xFF30;
cStatus = 0;
}
}QureyVerReport;

QureyVerReport结构体中,无论CommonIdCmd放在前面还是后面其sizeof(QureyVerReport)的值是5,
为什么是5?
CommonIdCmd的长度是4,如果按照字节对齐,那么sizeof(QureyVerReport)的值应该是8才对的啊。
求高手给予详细点的解答。

[解决办法]
是不是与你的编译参数有关

用gcc 64位模式编译时,输出12
[解决办法]
是不是取消了字节对齐.
[解决办法]
VS2010 结果为6

复合类型(结构体,联合,数组,枚举)是要展开为基本类型来进行对齐

相当于
typedef struct _tag_QureyVer
{
//CommonIdCmd Cmd; 
BYTE Cmd_Code;
BYTE Sub_Id;
WORD Sub_Cmd;
 
BYTE cStatus;
}QureyVerReport;

结果为6 可能是结构体的总大小为结构体最宽基本类型成员大小的整数倍
[解决办法]
未取消字节对齐?
对齐必然有个系数,从你这个,你的对齐系数竟然是1...
加上
#pragma pack()试试...
[解决办法]

探讨
未取消字节对齐这点是可以确定的,那个QureyVerReport结构体调试过程中sizeof的结果是5,这个是经过试验确定的。
编译器为VC6.0

[解决办法]
探讨
引用:
未取消字节对齐这点是可以确定的,那个QureyVerReport结构体调试过程中sizeof的结果是5,这个是经过试验确定的。
编译器为VC6.0


那我也没办法了,只能说:珍爱生命,远离vc6.0

[解决办法]
字节对齐应该一般由编译器决定。按字节对齐、按字对齐、4字节对齐。你这里是5,应该你的编译器默认按字节对齐。所以是5,你说的4字节对齐,你没有加pragma pack(4).所以仍然是按字节对齐。即使你加了pragma pack(4),也应该是6,因为你实际字节只有5个,系统会强制到双字对齐,否则会浪费3个字节的内存。只有你再加两个字节的成员变量时候才会是8.

热点排行