10

安全でないコードを必要としない固定サイズの配列を.NETに実装する良い方法はありますか?

私の目標は、他の型に埋め込む(メンバーとして含める)ことができる固定サイズの配列を表す値型を作成することです。つまり、配列を宣言する型とは別のオブジェクトとして配列を作成することを避けたいと考えています。 。

.NETの配列の実装は優れており、CLR / CILレベルでサポートされていることを認識しています。配列だけを使用するかどうかについては、あまり議論したくありません。ここでの調査は、安全な固定サイズかどうかです。 、値型の実装はほぼ同じくらい効率的に可能です。

4

2 に答える 2

5

目的は、他の型のプライベート メンバーとして使用できる固定サイズの値型配列を持つことができるようにすることです。カスタム ディクショナリまたはリンク リストの実装を検討してください。各バケット/ノードが独自の固定サイズの配列を含むようにフラット化されている場合、ヒープ割り当ての数を減らすことができます。

配列を値型にすることは、必ずしもスタックに格納されることを意味するわけではありません。実際、参照型に埋め込まれた値型の場合、スタックではなく、参照型のヒープに格納される可能性が最も高くなります。

したがって、それを値型にしても、ヒープ割り当てはまったく減りません。

詳細はこちら:リンク

于 2010-11-03T04:30:30.373 に答える
2

リフレクターを使用していくつかの調査を行った結果、C# は整数に対する switch ステートメントを CIL switch ステートメントにコンパイルし、ジャンプ リストとして実装されるため、以下が許容される (パフォーマンス上の) 解決策であることがわかりました... つまり、-ゲッターは約 11 の CIL 命令で実行されますが、これは問題ありません。

 public struct EmbeddedArray<T>
    {
        private T _element0;
        private T _element1;
        private T _element2;

        public int Length { get { return 3; } }


        public T this[int index]
        {
            get
            {
                switch (index)
                {
                    case 0:
                        return _element0;
                    case 1:
                        return _element1;
                    case 2:
                        return _element2;
                }
                throw new ArgumentOutOfRangeException("index");

            }
        }
    }

以下のハンスのコメントをご覧ください。これは私が望んでいたほどのパフォーマンスではないことが判明しました... CIL がネイティブ マシン コードにコンパイルされると、測定されたパフォーマンスは .NET 配列がもたらすものとはかけ離れています。

于 2010-11-03T07:27:47.810 に答える