0

ベクトル (1 行、4 列) を行列 (4x4) で乗算しようとしています。ベクトルは点のいくつかの座標を表し、私のアプリケーションでは、多くの点 (点) を持つことを意図しています。乗算を行う関数を作成しました:

    public static double[] Multiply(double[] point, double[,] matrix)
    {
        double[] aux = new double[4];
        for (int i = 0; i < 4; ++i)
        {
            aux[i] = 0; 
            for (int j = 0; j < 4; ++j)
            {
                aux[i] += point[j] * matrix[j, i];
            }
        }
        return aux;
    }

これは適切に機能するはずだと思います。

問題はこれです: 関数は静的ですが、使用するたびに新しい double[4] が生まれます (aux[])。私はこれを数百/千回 (1 秒) 必要とするので、アプリケーションを閉じるまでそれらの double (aux) がメモリに格納されているかどうかを知る必要があるため、大きなメモリ割り当てにクランクアップします。ガベージコレクターはそれら(古いもの)を削除していませんか?

もう 1 つの方法は、フィールド double[] (この aux) を持つ適切なクラス (マトリックス クラス) を構築し、それを何度も使用することです。

4

2 に答える 2

2

これは問題ではありません。メソッドは静的ですが、ここには静的状態はありません。静的な変数がある場合は、double[]心配する必要があります。

そのままでは、メソッドは単に配列を呼び出し元に返します。その呼び出し元は、その配列をコレクション内のインスタンス フィールドに、ローカル変数として、または誰が何を知っているかとして格納している可能性があります。その配列が実行可能なコードによって参照されなくなると、ガベージ コレクションによって配列がクリーンアップされます。

したがって、このメソッドを呼び出している人が結果を長時間保持している場合、結果は長時間残ります。発信者が非常に長い間それを保持していない場合、それは非常に長く留まることはありません.

于 2013-09-19T20:21:51.657 に答える
1

メモリについて心配する必要はありません。GC は未使用の配列をすべて収集します。MSDN でガベージ コレクションの詳細を読むことができます。

于 2013-09-19T20:21:54.193 に答える