3

いくつかのバージョンが 2 番目のバージョンよりも少ないメモリを消費するかどうか、いくつかのバージョンでは各ループ サイクルで変数に新しいスペースを割り当てたことが本当かどうか、ループ コードの各カップルについて知りたいと思いました。

注: 2 はかなり明白ですが、1 と 3 はより興味深いものです。

1 .

While(!exit)
{
  int x = 5;
}

対:

int x= 0;
While(!exit)
{
  x = 5;
}

参照型に関する同じ質問: 2

While(!exit)
{
      Point p = new Point();
      p.x = 5;
}

対:

Point p = new Point();
While(!exit)
{
      p.x = 5;
}

3 . 1 に似た割り当てのない参照型?:

While(!exit)
{
      Point p = point1;
}

対:

Point p = null;
While(!exit)
{
   p = point1;
}
4

3 に答える 3

4

コンパイラは、関数に必要なスタック ストレージの場所の数を決定し、その必要性を減らすためにできることを行います。何かのようなもの:

{
   int a;
   ...
}
{
   int b;
   ...
}

2 つの格納場所が必要なようですが、コンパイラは、最初の格納場所が最初のスコープ外で使用されることはなく、b の格納場所を再利用できることを確認できます。

また、スタックストレージをまとめて廃止し、すべてをレジスタで実行できることもわかるかもしれません。

ループするかどうかに関係なく、1 つの変数宣言で 1 つの格納場所が定義されます。ループの反復ごとに新しい保存場所が作成されることは決してありません。

一般に、これは気にする必要はありません。

「デバッグ」ビルドは、デバッグ中にそれらの変数を簡単に表示できるように、宣言されたすべての変数に対してスタック上に個別の格納場所を生成する場合があることに注意してください。

于 2012-12-14T17:27:48.357 に答える
0

伝えるための適切な方法は、それを分解してコードを確認することです。それぞれへの参照が表示されます。

それを行うMSDNの方法へのリンク:http://msdn.microsoft.com/en-us/library/f7dy01k1.aspx

コードはCILでかなり読みやすくなっています。関数名を検索するだけで、newなどの呼び出しが表示されます。

于 2012-12-14T17:28:24.377 に答える
0

それは問題ではありません。コンパイラはそれを最適化するので、同じままです。C# などのコンパイル済み言語では、パフォーマンスにはまったく影響しません。たとえば Java では、宣言は 1 回だけにした方がよいでしょう。

于 2012-12-14T17:25:49.197 に答える