Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/163.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
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 - Fatal编程技术网

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; } };

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;

然后MSVC++中的sizeofPacket返回12,而不是我所期望的16

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

我错过了什么


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[]之间进行转换;那是乌布。