1

今日は主な静的言語(C、C ++、java、C#)について言及しています。私はこれについていくつかの矛盾した答えを聞いたので、私は知りたいと思いました:

次のようなコードがある場合:

loop(...) {
  type x = val;
  ...
}

(「ループ」は、たとえばforなどのループの一種です)ループの
各反復でメモリ割り当てが発生しますか、それとも1回だけですか?これを書くこととは異なりますか?

type x;
loop(...) {
  x = val;
  ...
}

ここで、メモリはxに1回だけ割り当てられますか?

4

1 に答える 1

2

厳密に正しい答えは、どちらも意味的に正しいため、実装に依存するということです。言語仕様では、そのような実装の詳細を要求または禁止することはありません。

とは言うものの、その価値のある実装は、同じスタックスロットまたはCPUレジスターを再利用することができます(ネイティブコンパイルで、特にJITが存在する場合)。バイトコードでさえ完全に同一である可能性があります。

そして最後に、時期尚早の最適化があります...他に証明されない限り、このような低レベルの詳細について考える必要はありません(このような問題の知識と制御が重要であると考える場合は、おそらくアセンブラーでプログラミングする必要があります) 、 なぜなら:

  • マイクロベンチマークを実行している場合(または非常に膨大な数の処理タスクを実行している場合を除きますが、実際にパフォーマンスに夢中になっている人は何人いますか?)、最適化されていなくても違いに気付くことはありません。ループ本体で何か興味のあることをしている場合、それは違いを小さくします(もしあれば)。特にI/Oを実行している場合。
  • メモリ割り当てがある場合でも、ネイティブスタックで数バイトをプッシュおよびポップすることになり、ハードウェアレジスタに整数定数を追加することになります。すべてのCおよびC++プログラムは、ローカル変数にそのスタックを使用しますが、そのパフォーマンスについて不満を言う人は誰もいません...スペースを予約する必要がある場合は、スタックを使用するよりも速くなることはできません。
  • あなたがこの種の質問をしなければならないなら、あなたはそれについて何もすることができる人ではありません。それらの人々は、(1)それを測定し、(2)生成されたコードを見て、(3)このレベルで考える前に、大規模な最適化を探すことを知っています;)
于 2011-08-25T10:14:12.077 に答える