2012-03-12 11 views
0

私は、2倍と短い文字列(それぞれ15文字未満)で構成される20×10の配列を持っています。この配列は、呼び出されたときに関数内でのみ使用されます。文字列は定数であり、倍だけ変わります。大きな配列をローカルにする必要がありますか?

この配列を関数のローカルにする必要がありますか?私が気づいていないすべての考察?

私はこの機能と配列を計画しています。配列には追加の型がある可能性があります。そのため、まだ具体的なコードはありません。私が知っているのは、アレイのおおよその大きさと寸法です。

+2

コードを投稿できますか?私たちがあなたに指示を与えるのを助けなければならない。 – NickHeidke

+1

この設定に問題がありますか? – Oded

+0

複数のタイプの配列がありますか? –

答えて

4

単純にには、には配列のローカルインスタンスがありません。

配列は参照型なので、実際のメモリは常にヒープ上に割り当てられます。

So:はい、使用に適している場合は、(参照先の)配列変数をローカル変数にしておいてください。そして、それはありません:

この配列は、他の人は誰が来て、これを見てできるように可読性/わかりやすさの観点から、私は、配列をローカルになるだろう、唯一の機能一般

+0

ローカル配列が本当に*必要な場合は、それが 'stackalloc'の目的です。私はまだそれが必要だった場所を見てきました。 BCL全体では、数十のクラスでしか使用されません。 – Gabe

+0

@Gabe - そうですが、私はそれを無視することにしました。 –

+1

これは一種の分割毛です。これはC++ではありません。作成したリファレンスを持たずにコピーすることなく、既存のヒープ位置に「ポイント」することは決してありません。したがって、メソッドが終了するときにスコープから外れるメソッド内の変数を宣言すると、開発者の視点からは、メモリの割り当て場所に関係なく「ローカル」になります。ヒープ内にローカル値型を配置することもできます。それらをスタックに配置するという決定は、必ずしも真ではないCLR実装の詳細です。 – KeithS

2

あなたはメモリ使用量について信じられないほど心配していない限り、私は物事についてあまり心配しません(これは最近問題ではありません)。

3

内部で使用されていますコードは後で配列の使い方と範囲を理解することができます。あなたの後輩が検査によって、その配列が内部で宣言されている1つの関数だけで使用できることを知ることができる場合、変更を行う必要がある場合、変更の範囲と実行する必要があるテストが分かっています。同様にその機能を使用するコードパスに限定されています。

欠点は、この配列が何度も必要で値が変更されない場合、パフォーマンスの観点からはスコープを広げて寿命を延ばすことができるため、この配列を作成しGCingしないことです不必要に。クラスが何度もインスタンス化されますが、常に同じ値のセット(またはそのほとんど)を使用する場合は、静的にすることができます。あなたがこれを行うと、それは1つの関数でしか使用されていないということを文書化します(残念ながら、文書化は偽になってからずっと前から変わりませんが、少なくとも将来のコーダーに通知するためにあなたの部分をしています)。

これは本当にあなた次第です。私たちはあなたの質問から、あなたがこのコードを変更しているかどうかを示すかもしれない問題があるかどうかを知ることはできません。

2

現在、ローカル変数はすべての呼び出しでインスタンス化されます。

配列変数とその宣言を関数の外に置くと、doubleの値が0で始まらないため、使用する前にそれをクリーンアップする必要があります。

しかし、コードを見ることなく、それが良いか悪いかをあなたにアドバイスすることはできませんが、違いがあります。

関連する問題