2016-11-23 5 views
2

私はいくつかのメモリを割り当て、いくつかの値に初期化して、このメモリの異なるセグメントを異なる構造体にキャストしたいと思います。メモリを共用体にキャストする

union structA{ 
    __int8 mem[3]; 

    struct{ 
    unsigned field1 : 8; 
    unsigned field2 : 12; 
    unsigned field3 : 4; 
    }; 
}; 

struct structB{ 
    __int8 mem[10]; 
}; 


__int8 globalMem[128]; 

structA a1 <---- &globalMem[0] 
structA a2 <---- &globalMem[10] 
structB b1 <---- &globalMem[30] 

私はreinterpret_castはを使用してみました、私は任意のコンパイラエラーを得ることはありませんが、私の変数(a1a2b1が)本当に正しく初期化/割り当てられていないようです:何かが次のように。

これがなぜ機能しないのか、これを実現する正しい方法は何ですか?

ありがとうございます!あなたがするつもり何を達成するために

+4

ビットフィールドの整列と埋め込みは実装定義です。コンパイラがビットフィールドを使用して構造体にパディングを追加したかどうかを調べる必要があります。可能性が高い –

+0

また、署名された基底型( '__int8')を使用することは最適ではないかもしれません。 –

+1

プログラムを とラップしようとしました 'プラグマパック(プッシュ、1) プログラム プラグマパック(ポップ)' Sam Varshavchikが言及したように、パディングの問題はなくなります。 – GoldenSpecOps

答えて

0

reinterpret_castを使用する必要があります:

structA a1 = *reinterpret_cast<structA*>(&globalMem[0]); 
structA a2 = *reinterpret_cast<structA*>(&globalMem[10]); 
structB b1 = *reinterpret_cast<structB*>(&globalMem[30]); 

これで間違っているのですか?

C++ structclassの特別な種類で、異なるglobalMemアドレスに内容があなたの場合を除き、適切なオブジェクトとして初期化されていないため、この種の代入は」(意味オブジェクトを尊重していないので、これは、細心の注意が必要ですあなたのコードのどこかにplacement newを使ってください)。

この種のトリックを使用する前に、structAがトリビュアコピー可能(is_trivially_copyable<structA>::value)であることを確認することもできます。

さらに、globalMemには整列制約はありませんが、コンパイラ/アーキテクチャによっては、structAには単語の位置合わせが必要な場合があるため、尊重しないかもしれない整列制約の問題があります。

最後に、structAのサイズは、あなたの考えるように必ずしも3ではありません。いくつかのコンパイラで実際にはそれはあなたが2つのアンダースコアで始まる標準タイプuint8_tの代わりに、コンパイラ固有の型名を使用することができthis online demo

追加発言

のように、4になります。

トピックの整列とサイズに関しては、メモリレイアウトの前提について非常に慎重にすることをお勧めします。私はむしろあなたのglobalMemに、それが含まれているすべての構造体の構造体を作ることを考えて、適切なオブジェクトセマンティックを保証し、安全なレイアウトを持つように提案するでしょう。

+0

を参照してください。これは、globalMemの一部をa1などにコピーするだけです.a1、a2、およびb1はglobalMemの部分に実際にはマップされません。 – Ali

+0

@Aliレイアウトに関するいくつかの問題があります(編集を参照)。これは、あなたのマッピングコントロールが間違った前提を取っていると思うようになります(構造体Aのサイズから始まります)。私はあなたにこのオンラインデモを見てみましょう:http://ideone.com/K3PYpTここでは、再解釈キャストにもかかわらず、prpeprlyで初期化されたオブジェクトが正しくコピーされていることがわかります。しかし、再解釈のキャストは、通常再考する価値のあるトリッキーなデザインを示します。 – Christophe

関連する問題