sizeof(struct)返回的SMALLER小于预期值吗?

时间:2016-07-21 13:16:38

标签: c++ struct sizeof

我有这个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; }
};

然后MSVC ++中的sizeof(Packet)返回12而不是16,这是我所期望的。

奇怪的是,这比预期值小。如果它更大可能是因为对齐问题。

我错过了什么?

TIA

1 个答案:

答案 0 :(得分:10)

为什么你认为它应该更大?

它包含3个$dbh = new PDO('mysql:dbname=test;host=127.0.0.1', 'root', '', array(PDO::ATTR_DEFAULT_FETCH_MODE => PDO::FETCH_ASSOC)); $sql = $dbh->prepare("INSERT INTO `Address` (`ID`, `Street`, `Street2`, `Town`, `County`, `Postcode`) VALUES (NULL, ?,?,?,?,?)"); $sql->execute(array('street', 'street2', null, 'county', 'postcode')); $addressID = $dbh->lastInsertId(); var_dump($addressID); // string(1) "0" exit; ,没有虚拟方法,正好是12个字节。

联合不计,因为它是一个类型,它不包含该类型的成员。

如果您希望您的类包含union的单个实例,其中包含结构的单个实例,您应该写:

uint32

struct Packet { uint32 MessageCount; uint32 Length; uint32 FieldValue; union { uint32 typeInfo; struct { uint8 MagicNumber[3]; uint8 Version; } /* MagicVersion */; }; } /* PacketHeader */; 中的名称是可选的,您可以指定它们。如果您这样做,则必须使用/**/ / union的名称访问其成员,否则您将拥有一个扁平的struct结构。