我得到了以下结构:
struct Packet
{
short PacketSize;
short Type;
};
struct SizeValidity
{
short SizeEnc;
};
struct SendEncSecureCode
{
Packet header;
short EncSecurityToken;
int lTime;
SizeValidity ending;
};
在我的代码中,我希望使用sizeof运算符来获取结构的大小:
SendEncSecureCode sendpacket;
sendpacket.header.PacketSize = sizeof SendEncSecureCode;
问题是我总是得到大小0x10而不是0x0C我正在编写,所以我将INT类型更改为DWORD仍然是同样的问题,稍后我尝试使用DWORD32并且仍然相同,编译器将其设置为8个字节。我正在研究VC11 Beta,软件的目标是x86而不是x64。感谢
答案 0 :(得分:3)
这称为填充。编译器使用零字节填充结构的不同成员之间的空间,以更好地将成员对齐到CPU可以更快地读取的地址。您可以(但不应该除非您有充分的理由)使用the pack
pragma覆盖此行为:
#pragma pack(push, 0)
struct {...};
#pragma pack(pop)
这会强制此结构的填充为零字节。你可以改变零点。
答案 1 :(得分:0)
要获得您期望的大小,您可以告诉编译器使用1字节打包:
#pragma pack(push, 1)
struct Packet
{
short PacketSize;
short Type;
};
struct SizeValidity
{
short SizeEnc;
};
struct SendEncSecureCode
{
Packet header;
short EncSecurityToken;
int lTime;
SizeValidity ending;
};
#pragma pack(pop)