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