2012-03-21 4 views
2

uint32_t、uint8_tを連続して連続して共有メモリに格納する最良の方法は何ですか? すなわち、私たちはabとしてuint8_tとしてuint32_tを表している場合、私は共有メモリにそれを保存したい単一の共有メモリ内の異なるタイプ

ababababababababababababab

としてこれを行うための最善の方法は何か?私はvoid *を使用して共有メモリに何か書き込むたびに型キャストする必要がありますか?それとも簡単な方法がありますか? Typecastingは、後で共有メモリを掘り下げたいときに複雑になるでしょうか?

+0

構造体、おそらく、または共用体であり、常にペアとして表示されるかどうかによって異なります。どちらかといえば、あなたの目標だったかどうかにかかわらず、どちらかといえども整列のためにギャップが生じるでしょう。 – tbert

+3

あなたは* best *の意味を定義する必要があります。ベストはメンテナンスが容易で、メモリがよりコンパクトで効率的であり、異なる目標は異なるアプローチにつながる可能性があります。また、本当にインターリーブする必要がありますか? –

+0

私は整列のためにスペースを失いたくない。それで私は構造を避けたいのです。この場合、 –

答えて

2

パック構造体の配列が良い賭けのように聞こえる、何のキャストは必要ありません。

+0

ああ、それは共有メモリ、OK、パックされた構造体の配列に変換します。あなたが望む任意のサイズを宣言することができます(理由の範囲内で)。 –

+1

私は整列のためにスペースを失いたくはありません。 –

+4

@PrasanthMadhavan:それは答えのポイントです:構造が**パックされている場合**:*あなたは*できません。 – ereOn

0

sizeof(a) + sizeof(b)のサイズの共有メモリ・セグメントを作成し、他の後にそれぞれの値を格納します。

memcpy(shm, &a, sizeof(a)); 
memcpy(shm + sizeof(a), &b, sizeof(b)); 
1

データをパックする必要がある場合、明白なことは、実装固有のプラグマを使用して構造体をパックし、パディングを回避することです。 (?なぜ)あなたがいることを行うにはしたくない場合は、このような何かをするだろう:write_aread_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のように、それを移植することができます。

関連する問題