2010-12-21 12 views
3

このタイプのオブジェクトをスタックに作成すると、このオブジェクトのメモリが正しくアライメントされるという保証はありますか?メモリのアライメントの問題

union my_union 
{ 
    int value; 
    char bytes[4]; 
}; 

charバイト[4]をスタックに作成して整数にキャストしようとすると、整列の問題が発生する可能性があります。その問題をヒープで作成することで回避できますが、ユニオンオブジェクトの保証はありますか?論理的にはあるはずですが、私は確認したいと思います。

ありがとうございました。

答えて

3

まあ、それはどういう意味ですか。

あなたが意味する場合:私は、互いに独立してそれらを使用することができるように

は、両方の労働組合のintchar[4]メンバーが適切に整列されますか?

はい。あなたが意味する場合:私はchar[4]を通じてintの個々のバイトにアクセスできるように

intchar[4]メンバーは、同じ量の空間を占有するために整列されることが保証されますか?

次に、 sizeof(int)は4であることが保証されていないためです。intが2バイトの場合、charの要素のどれがunionint(標準は指定されていません)に対応するでしょうか?あなたがintの個々のバイトにアクセスするために労働組合を使用したい場合は

、これを使用する:各メンバーが同じサイズである

union { 
    int i; 
    char c[sizeof(int)]; 
}; 

ので、それらが同じスペースを占有することが保証されています。これは私があなたが知りたいと思っていることであり、私はそれに答えることを願っています。

+0

古いCコードでは、 'c [0]'と宣言していました。その後、通常のようにアクセスします。これがC++でも有効かどうかは不明です。 –

+0

私は最初のことを意味しました。ご回答ありがとうございます。 – confucius

+0

@Martin - おそらくそうではありませんが、 'c [1]'も同様に動作します。 –

1

そうでなければ、組合はまったく役に立たないでしょう。

+0

同意します。それも私の印象でしたが、確認する方が良いです。ありがとう:) – confucius