2009-03-31 9 views
7

C++にはこのようなことはありませんか?C++ユニオン配列とvars?

union { 
    { 
     Scalar x, y; 
    } 
    Scalar v[2]; 
}; 

どこx == v[0]y == v[1]

+2

C++は配列の要素が連続して配置されることを保証しますが、POD構造体の要素のアドレスが以前宣言されたすべての要素のアドレスよりも大きいことを保証しています。つまり、v [1]とyは対応していない可能性はありますが、それは可能です。 –

+0

@ j_random_hacker:本当ですか?私は、Cから継承された別のルールがあると信じています。そこから、最初のパディングはありません(最初の要素の型のポインタを介して構造体にアクセスすることについてのエイリアシングルールIIRCの何か) – MSalters

+1

C++も同様です。最初のパディングはありませんが、@ j_random_hackersポイントは、最初の要素の後に(そして2番目の要素の前に)構造体にパディングがある可能性があると考えています – jalf

答えて

14

どの程度

union { 
    struct { 
     int x; 
     int y; 
    }; 
    int v[2]; 
}; 

編集:醜い

union a { 
    struct b { int first, second; } bee; 
    int v[2]; 
}; 

ていますが、C++ではなくCを使用しているので、それらが同じタイプであるため、それが

+0

もちろん!構造体!ブリリアント! – mpen

+1

union_name.struct_name.xを参照できるように、構造体に名前を付けませんか? –

+0

私は "b bee"という行を崩壊させ、 "struct b {...} bee;" – rmeador

1

「スカラー」が何であるかに応じて、C++で行うことができます。構文はあなたの例で書いたものとほとんど正確に(おそらく正確には、でも、私は組合では錆びている)です。これは、C言語と同じですが、ユニオンに含めることができる型(IIRCではデフォルトのコンストラクタが必要です)に制限がある点を除きます。関連するWikipedia articleがここにあります。

+0

スカラは浮動小数点または倍精度です。ありがとう – mpen

16

より正確です、なぜva [0]への参照を参照するだけではなく、v [1]への参照を参照してください。

+2

+1。これは、v [1]がyに対応するC++言語規則によって保証されていないという事実をうまく乗り越えます。 –

+0

構造体上で動作するコードがこれらの参照をローカル変数として宣言することを意味すると仮定すると、コンパイラはそれらを最適化して、パフォーマンスを心配する必要はありません。 –

6

試してみてください:

template<class T> 
struct U1 
{ 
    U1(); 
    T v[2]; 
    T& x; 
    T& y; 
}; 

template<class T> 
U1<T>::U1() 
    :x(v[0]) 
    ,y(v[1]) 
{} 

int main() 
{ 
    U1<int> data; 

    data.x = 1; 
    data.y = 2; 
} 
+1

g ++はsizeof(U1 )を12ではなく2にします。(g ++ 4.0.1) –

+0

@Michael:なぜそれは2であるべきだと思いますか? –

+4

私は、基本的に2つのデータへのアクセスを提供する何かのために、結果として得られる構造体は2つの追加ポインタを保持することによって大幅に拡張されていると言っています...それは場合によっては受け入れられ、この解決策を見ている人にはただの警告です。 –

4

私はこれまでにこのようなものを使用しました。私はその標準で100%OKだとは確信していませんが、それを使用するのに必要なコンパイラであればOKです。

struct Vec2 
{ 
    float x; 
    float y; 
    float& operator[](int i) { return *(&x+i); } 
}; 

したい(あなたはおそらくしたいはずです)、あなたはあまりにも[]演算子のconstのバージョンを提供できる場合は、[]オペレータに境界チェックなどを追加することができます。