在struct error上键入int

时间:2012-07-26 04:46:47

标签: c++

我得到了以下结构:

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。感谢

2 个答案:

答案 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)

请参阅http://vcfaq.mvps.org/lang/11.htm