私が持っているとしましょう:
int counter;
++counter;
問題は、メモリ (スタック) で何が起こったのかということです。新しい変数がスタックに作成され、前の変数の値をコピーして +1 を追加するか、temp 変数を使用している場合は、そこに +1 を追加してから新しい値をカウンターに配置しますか?
の値がcounter
メモリから CPU レジスタにロードされ、インクリメントされてから、同じメモリ アドレスに書き戻されます。このプロセス中に追加のメモリが割り当てられることはなくcounter
、スタック内または他の場所に存在する場合でも違いはありません。
状況によりますが、通常はメモリには何も起こりません。ジッタによって行われる最も重要な仕事の 1 つは、メモリをできるだけ使用しないようにすることです。特にあなたのようなローカル変数の場合。代わりに、変数の値を CPU レジスタに格納します。また、++ 演算子は単純に INC マシン コード命令を生成して、レジスタ内の値をインクリメントします。非常に高速で、0 または 1 CPU サイクルかかります。別の命令と並行して実行できるため、0 が一般的です。
ジッターによって実行される最適化のリストについては、この回答を参照してください。
.Net は最初に中間言語 (IL) にコンパイルされます。
follogin .Net C# コード
private void Form1_Load(object sender, EventArgs e)
{
int i = 0;
i++;
int j = 0;
++j;
}
逆アセンブラーで表示された IL コードにコンパイルします。
ldc.i4.0 //ldc = load constant on evaluation stack
stloc.0 //Store on top of the evaluation stack
ldloc.0 //Load a local variable
ldc.i4.1 //ldc = load constant on evaluation stack
add //add
stloc.0 //Store on local evaluation stack
ldc.i4.0 //Load contant 0 on the evaluation stack
stloc.1 //Store this on variable location 1
ldloc.1 //Load variable location 1
ldc.i4.1 //Load constant 1 on evaluation stack
add //Add
stloc.1 //Store on evaluation stack
この場合は問題にならないことがわかります。どちらも同じようにコンパイルされます。最初に値をスタックにロードし、変数に格納します。次に、スタックに値 1 をロードし、変数に追加して保存します。
これが最終的にどのように CPU 命令にコンパイルされるのかはわかりません。
++counter はカウンターをインクリメントし、新しくインクリメントされた値を返します。counter++ は counter をインクリメントし、インクリメント前の値を返します。
これはジョンの答えに加えてです。
++ 演算子が変数の前と変数の後に使用される場合に 1 つの違いがあります。以下の例を検討してください。
int[] arr = { 1, 2, 3 };
int counter = 0;
Console.WriteLine(arr[counter++]);
Console.WriteLine(arr[++counter]);
はcounter++
1 を++counter
出力し、3 を出力します。