データをパックする必要がある場合、明白なことは、実装固有のプラグマを使用して構造体をパックし、パディングを回避することです。 (?なぜ)あなたがいることを行うにはしたくない場合は、このような何かをするだろう:write_a
とread_b
ため
typedef uint8_t (*Thingy)[sizeof(uint32_t) + 1];
static inline uint32_t read_a(Thingy t) {
uint32_t val;
memcpy(&val, t, sizeof(uint32_t));
return val;
}
static inline void write_b(Thingy t, uint8_t val) {
reinterpret_cast<uint8_t*>(t)[sizeof(uint32_t)] = val;
}
と明らかに。
これらの4つのスニペットから、味に応じてC++でオブジェクトをより多くのオブジェクトにすることができます。私は++
と+ n
がイテレータから期待したことをしますが、イテレータと同じように*thingy
に割り当てることはできません。 uint8_t*
データメンバを保持し、同じことを達成するために必要な演算子をオーバーロードし、メンバ関数または多分プロキシオブジェクトを介して読み書きするクラスを書くこともできます。
uint8_t
が存在するということは、必ずsizeof(uint32_t) == 4
を意味します。だから、他の場所から一定の値を持っているのなら、#define PACKED_THINGY_SIZE 5
のように、それを移植することができます。
構造体、おそらく、または共用体であり、常にペアとして表示されるかどうかによって異なります。どちらかといえば、あなたの目標だったかどうかにかかわらず、どちらかといえども整列のためにギャップが生じるでしょう。 – tbert
あなたは* best *の意味を定義する必要があります。ベストはメンテナンスが容易で、メモリがよりコンパクトで効率的であり、異なる目標は異なるアプローチにつながる可能性があります。また、本当にインターリーブする必要がありますか? –
私は整列のためにスペースを失いたくない。それで私は構造を避けたいのです。この場合、 –