我的问题如下:我有一个64位的变量,类型为uint64_t
(所以我知道它被指定为至少64位宽)。
我希望能够引用它的不同部分,例如将其分解为两个uint32_t
、四个uint16_t
或八个uint8_t
。有没有一种符合标准的方法可以不依赖于未定义的行为?
我的方法如下:
class Buffer
{
uint64_t m_64BitBuffer;
public:
uint64_t & R64() { return m_64BitBuffer; }
uint32_t & R32(R32::Part part) { return *(reinterpret_cast<uint32_t*>(&m_64BitBuffer)+part); }
uint16_t & R16(R16::Part part) { return *(reinterpret_cast<uint16_t*>(&m_64BitBuffer)+part); }
uint8_t & R8(R8::Part part) { return *(reinterpret_cast<uint8_t*>(&m_64BitBuffer)+part); }
};
其中R32::Part
、R16::Part
和R8::Part
是分别定义0和1、0和3以及0和7之间的值的enum
。
我想这应该没问题。例如,对齐应该没有问题。我想知道我是否违反了任何规则,如果是的话,如何正确地做到这一点。
发布于 2015-06-01 03:30:06
某些编译器允许通过联合进行类型传递,因此您可以简单地拥有以下匿名联合成员:
union {
uint64_t val;
struct { uint32_t as32[2]; };
struct { uint16_t as16[4]; };
struct { uint8_t as8[8]; };
} u;
对每个部分的访问就像从适当的成员读取一样简单。
https://stackoverflow.com/questions/30565115
复制