1

我得到以下结构:

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

4

2 回答 2

3

这称为填充。编译器用零字节填充结构的不同成员之间的空间,以更好地将成员与 CPU 可以更快读取的地址对齐。您可以(但除非您有充分的理由,否则不应)使用 pragma 覆盖pack行为

#pragma pack(push, 0)
struct {...};
#pragma pack(pop)

这会强制此结构的填充为零字节。你可以改变零。

于 2012-07-26T04:49:09.960 回答
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

于 2012-07-26T04:52:18.327 回答