如何引用特定变量中的子元素

How can I refer to sub-elements in a particular variable?

本文关键字:变量 元素 何引用 引用      更新时间:2023-10-16

我的问题如下:我有一个64位变量,类型为uint64_t(所以我知道它被指定为至少64位宽)。

我希望能够引用它的不同部分,例如将其分解为两个uint32_t s,四个uint16_t s或八个uint8_t s。是否有一种符合标准的方法来做到这一点,而不依赖于未定义的行为?

我的方法如下:

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::PartR16::PartR8::Partenum s,分别定义0 ~ 1、0 ~ 3、0 ~ 7之间的值。

我想这应该没问题。例如,对齐应该没有问题。我想知道我是否违反了任何规则,如果是,如何正确地做到这一点。

某些编译器允许通过联合进行类型双关,因此您可以简单地使用以下匿名联合成员:

union {
    uint64_t val;
    struct { uint32_t as32[2]; };
    struct { uint16_t as16[4]; };
    struct { uint8_t as8[8]; };
} u;

访问每个部分就像从相应的成员中读取一样简单。