sizeof(struct) returns 比预期值小?
sizeof(struct) returns a SMALLER than expected value?
我有这个 C++ 结构:
struct Packet
{
uint32 MessageCount;
uint32 Length;
uint32 FieldValue;
union PacketHeader
{
uint32 typeInfo;
struct MagicVersion
{
uint8 MagicNumber[3];
uint8 Version;
};
};
Data * Payload(void) { return reinterpret_cast< Data * >(this + 1U); }
Data const * Payload(void) const { return reinterpret_cast< Data const * >(this + 1U); }
Packet * nextPacket(void) { return reinterpret_cast< Packet * >(this + 1U) + Length; }
Packet const * nextPacket(void) const { return reinterpret_cast< Packet const * >(this + 1U) + Length; }
};
然后 sizeof(Packet)
在 MSVC++ 中 returns 12 而不是我期望的 16。
当然,奇怪的是这比预期值小。如果它更大,可能是因为对齐问题。
我错过了什么?
TIA
为什么你认为它应该更大?
它包含 3 个 uint32
,没有虚拟方法,正好是 12 个字节。
联合不算在内,因为它是一种类型,不包含该类型的成员。
如果你希望你的 class 包含联合的单个实例,其中包含结构的单个实例,你应该写:
struct Packet
{
uint32 MessageCount;
uint32 Length;
uint32 FieldValue;
union
{
uint32 typeInfo;
struct
{
uint8 MagicNumber[3];
uint8 Version;
} /* MagicVersion */;
};
} /* PacketHeader */;
/**/
中的名称是可选的,您可以指定也可以不指定。如果这样做,您必须使用 union
/struct
的名称访问它们的成员,否则您将拥有一个扁平的 Packet
结构。
我有这个 C++ 结构:
struct Packet
{
uint32 MessageCount;
uint32 Length;
uint32 FieldValue;
union PacketHeader
{
uint32 typeInfo;
struct MagicVersion
{
uint8 MagicNumber[3];
uint8 Version;
};
};
Data * Payload(void) { return reinterpret_cast< Data * >(this + 1U); }
Data const * Payload(void) const { return reinterpret_cast< Data const * >(this + 1U); }
Packet * nextPacket(void) { return reinterpret_cast< Packet * >(this + 1U) + Length; }
Packet const * nextPacket(void) const { return reinterpret_cast< Packet const * >(this + 1U) + Length; }
};
然后 sizeof(Packet)
在 MSVC++ 中 returns 12 而不是我期望的 16。
当然,奇怪的是这比预期值小。如果它更大,可能是因为对齐问题。
我错过了什么?
TIA
为什么你认为它应该更大?
它包含 3 个 uint32
,没有虚拟方法,正好是 12 个字节。
联合不算在内,因为它是一种类型,不包含该类型的成员。
如果你希望你的 class 包含联合的单个实例,其中包含结构的单个实例,你应该写:
struct Packet
{
uint32 MessageCount;
uint32 Length;
uint32 FieldValue;
union
{
uint32 typeInfo;
struct
{
uint8 MagicNumber[3];
uint8 Version;
} /* MagicVersion */;
};
} /* PacketHeader */;
/**/
中的名称是可选的,您可以指定也可以不指定。如果这样做,您必须使用 union
/struct
的名称访问它们的成员,否则您将拥有一个扁平的 Packet
结构。