sizeof(struct)返回的值是否小于预期值? 我有这个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++中的sizeofPacket返回12,而不是我所期望的16 奇怪的是,这当然小于预期值。如果它更大,可能是因为对齐问题 我错过了什么sizeof(struct)返回的值是否小于预期值? 我有这个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; } };,c++,struct,sizeof,C++,Struct,Sizeof,然后MSVC++中的sizeofPacket返回12,而不是我所期望的16 奇怪的是,这当然小于预期值。如果它更大,可能是因为对齐问题 我错过了什么 TIA为什么你认为它应该更大 它包含3个uint32,没有虚拟方法,正好是12个字节 联合不算数,因为它是一个类型,所以它不包含该类型的成员 如果希望类包含union的单个实例(union包含结构的单个实例),则应编写: struct Packet { uint32 MessageCount; uint32 Length;
TIA为什么你认为它应该更大 它包含3个uint32,没有虚拟方法,正好是12个字节 联合不算数,因为它是一个类型,所以它不包含该类型的成员 如果希望类包含union的单个实例(union包含结构的单个实例),则应编写:
struct Packet
{
uint32 MessageCount;
uint32 Length;
uint32 FieldValue;
union
{
uint32 typeInfo;
struct
{
uint8 MagicNumber[3];
uint8 Version;
} /* MagicVersion */;
};
} /* PacketHeader */;
/**/中的名称是可选的,您可以指定或不指定。如果这样做,则必须使用union/struct的名称访问其成员,否则将使用平面数据包结构。C++同时支持未命名和匿名union。所以,如果他移除了PacketHeader,这应该是有效的。如果删除union关键字后的PacketHeader名称,则SizeOffPacket将为16字节。但是g++会发出呜呜声,因为嵌套在无名union中的命名结构不可能存在。因为该名称再次出现在错误的位置。如果要声明匿名结构的单个实例,应将名称放在右括号后。或者,您可以在不提供名称的情况下进行转换。请注意,您不应使用此联合在uint32_t和uint8_t[]之间进行转换;那是乌布。