我的问题如下:我有一个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
为enum
,分别定义0到1,0和3以及0和7之间的值。
我想这应该没问题。例如,对齐应该没有问题。我想知道我是否违反任何规则,如果是,那么如何正确地做到这一点。
答案 0 :(得分:0)
某些编译器允许通过联合进行类型惩罚,因此您可以简单地使用以下匿名联盟成员:
IBMDataObject
访问每个部分就像从相应的成员那里阅读一样简单。