2012-02-20 50 views
5

できるだけ主にスタックに格納され、オブジェクトが作成されないため、C#でstructを使用します。これにより、パフォーマンスが向上します。配列が構造体(C#)の要素として使用されている場合、その配列はどこに格納されていますか?

一方、配列はヒープに格納されます。

struct MotionVector 
{ 
    int[] a; 
    int b; 
} 

はその後の結果がどうなるかを次のように私は、何かを構造体の要素として配列を含む場合

私の質問は、です。その配列はスタックに格納されますか?または、構造体を使用することのパフォーマンス上の利点が失われますか?

+2

http://stackoverflow.com/questions/3942721/c-structs-versus-classes –

+1

実績の問題はありますか? http://blogs.msdn.com/b/ericlippert/archive/2009/04/27/the-stack-is-an-implementation-detail.aspx – ken2k

+0

http://stackoverflow.com/a/1114152/55209を参照してください。 - 優れた説明 –

答えて

0

要素を動的に作成したくない場合は、起動時にMotionVectorインスタンスの(大きな)バッファを作成し、必要に応じてそれらを再利用することを検討してください。それからあなたは、それらをダイナミックに作成/破壊するというペナルティを受けることはありません。

もちろん、「フリー」インスタンスを取得して取得するには、そのために構造体にブール値を使用するか、またはインターフェイスを使用する必要があります。

のアプリの初期化中motionvectorsを作成します:

MotionVectors motionVectors; 

は、動きベクトルクラスにブール値を追加します。

public class MotionVector 
{ 
    bool InUse { get; set; } 

    public MotionVector() 
    { 
     InUse = false; 
    } 
} 

は、新しいクラスを定義しますが、例えばでしこれを行うには

モーションベクター:

class MotionVectors 
{ 
    MotionVector _instances[100]; 

    public void Free(MotionVector vector) 
    { 
     var index = 'search vector in _instances' 
     _instances[index].Inuse = false; 
    } 

    public MotionVector GetNewInstance() 
    { 
     var index = 'first free vector in _instances' 
     _instances[index].Inuse = true; 
     return _instances[index]; 
    } 
} 
+0

これは本当に良いアイデアのようです。どうもありがとうございます。あなたはそれを行う方法のいくつかの例を指摘できますか? – shahensha

+0

私は本当の例がないのが怖いですが、私の答えはちょっと変わってきます。 –

+0

ありがとう@Michel – shahensha

8

アレイへのポインタのみがスタックに格納されます。実際の配列はヒープに格納されます。

1

int[] aは参照型です。つまり、整数の配列を参照します。 'reference'自体はスタックに格納されます。ただし、参照するデータは、次のような場合にヒープに格納されます。

MotionVector z; 
z.a = new int[10]; 
1

構造体内のaの参照を保持します。それはスタック上の構造体の一部になります。

実際のint []オブジェクトは、初期化した場合にはどこにでも行くことができます(ほとんどのアーキテクチャではヒープ)。

関連する問題