0

今、私は次のような構造体を持っています:

struct Struct {
    uint8_t val1 : 2;
    uint8_t val2 : 2;
    uint8_t val3 : 2;
    uint8_t val4 : 2;
} __attribute__((packed));

すべてのvalsa 単一配列を作成する方法はありますか? 要点は、使用されるスペースではなく、すべての値の場所です。パディングなしでメモリ内に配置し、それぞれが 2 ビットを占有する必要があります。配列を持つことは重要ではありません。インデックスによる単純なアクセスを持つ他のデータ構造は問題ありません。プレーンな C か C++ かは関係ありません。読み取り/書き込みのパフォーマンスは重要です。これは、現在インデックス アクセスに使用されている単純なビット操作と同じ (似ている) 必要があります。

アップデート:

私が正確に欲しいものは次のように説明できます

struct Struct {
    uint8_t val[4] : 2;
} __attribute__((packed));
4

2 に答える 2

0

現在進行中のちょっとした作業を手動で行う必要があります。

constexpr uint8_t get_mask(const uint8_t n)
{
  return ~(((uint8_t)0x3)<<(2*n));
}

struct Struct2
{
  uint8_t val;

  inline void set_val(uint8_t v,uint8_t n)
  {
    val = (val&get_mask(n))|(v<<(2*n));
  }

  inline uint8_t get_val(uint8_t n)
  {
    return (val&~get_mask(n))>>(2*n);
  }

  //note, return type only, assignment WONT work.
  inline uint8_t operator[](uint8_t n)
  {
    return get_val(n);
  }
};

実際のアセンブリ コマンドを使用すると、パフォーマンスが向上する可能性があることに注意してください。

また、(ほとんど) 何があっても、uint8_t [4] はこれよりも優れたパフォーマンスを発揮し、プロセッサにアラインされた型 (uint32_t) はさらに優れたパフォーマンスを発揮する可能性があることに注意してください。

于 2014-02-10T16:44:56.867 に答える