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 结构。