0

私はメモリ管理について多くのことを読みましたが、現時点ではまだ把握できないことがいくつかあります。これはぎこちなく見えるかもしれませんが、以下のコードは

  1. パフォーマンスの問題
  2. メモリの浪費

この関数 "Bitmap b=Iprocessing.Colour_style(Bitmap a)" は、グレー スケール イメージ a を受け取り、それに色を付けて、カラー イメージ b を返します。

newキーワードが使用されていないため、images[1]処理後の変数が古いコンテンツに置き換えられ、新しいメモリが作成されないという考えで進んでいます。

教えてください

  for(int i=0; i<images.Count;i++)   {   
    images[i] = Iprocessing.Colour_style((Bitmap)images[i]);
  }
4

1 に答える 1

0

ここでの変数iandですimages(そしてimages、宣言を見ないと確信が持てません - フィールドである可能性もあります)。imagesこれは単なる参照です (のように見えます) a List<Image>- したがって、全体imagesは 4 または 8 バイトです。リスト自体はより多くのスペースを必要とします。オブジェクト自体、バッキング配列、およびいくつかのカウンターがあります。配列内の要素を交換する場合と同様に、リスト内のアイテムを交換する場合、リスト/配列内に余分なスペースを割り当てる必要はありません。

ここで割り当てを引き起こす可能性がある(そしてほぼ確実に発生する) ことの1 つIProcessing.Color_style、 . これは、(古いイメージを変更するのではなく) 古いイメージに基づいて新しいイメージを作成するように思えますさらに、古いイメージを破棄していないように見えるため、そのイメージを使用している場所がこれだけである場合、いくつかの問題が発生する可能性があります。イメージはIDisposableGDI+ ハンドルにリンクされています。それらを破棄しないと、メモリOutOfMemoryExceptionにリンクされていないという問題が発生する可能性があります、しかし実際には GDI+ ハンドルに。特に、ガベージ コレクションがあまり頻繁に行われないように、予備のメモリがたくさんある場合は注意が必要です。もちろん、これも少し複雑です。そのイメージを別の場所 (コントロールなど) で使用している場合、すぐに破棄したくないからです。

行に割り当てを含める必要はありませんnew(割り当ては、メソッド呼び出し、演算子、プロパティの背後に隠すことができます)。同様に、関連するすべての行がnew割り当てを必要とするわけではありません (値の型は既存の場所の上に初期化されます)。

于 2013-04-17T06:34:30.840 に答える