我有这个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
答案 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
结构。