3

私が持っているとしましょう:

int counter;
++counter;

問題は、メモリ (スタック) で何が起こったのかということです。新しい変数がスタックに作成され、前の変数の値をコピーして +1 を追加するか、temp 変数を使用している場合は、そこに +1 を追加してから新しい値をカウンターに配置しますか?

4

5 に答える 5

7

の値がcounterメモリから CPU レジスタにロードされ、インクリメントされてから、同じメモリ アドレスに書き戻されます。このプロセス中に追加のメモリが割り当てられることはなくcounter、スタック内または他の場所に存在する場合でも違いはありません。

于 2012-10-11T11:39:48.140 に答える
3

状況によりますが、通常はメモリには何も起こりません。ジッタによって行われる最も重要な仕事の 1 つは、メモリをできるだけ使用しないようにすることです。特にあなたのようなローカル変数の場合。代わりに、変数の値を CPU レジスタに格納します。また、++ 演算子は単純に INC マシン コード命令を生成して、レジスタ内の値をインクリメントします。非常に高速で、0 または 1 CPU サイクルかかります。別の命令と並行して実行できるため、0 が一般的です。

ジッターによって実行される最適化のリストについては、この回答を参照してください。

于 2012-10-11T11:52:13.260 に答える
1

.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 命令にコンパイルされるのかはわかりません。

于 2012-10-11T12:52:20.980 に答える
0

++counter はカウンターをインクリメントし、新しくインクリメントされた値を返します。counter++ は counter をインクリメントし、インクリメント前の値を返します。

于 2012-10-11T11:40:31.520 に答える
0

これはジョンの答えに加えてです。

++ 演算子が変数の前と変数の後に使用される場合に 1 つの違いがあります。以下の例を検討してください。

        int[] arr = { 1, 2, 3 };
        int counter = 0;

        Console.WriteLine(arr[counter++]);
        Console.WriteLine(arr[++counter]);

counter++1 を++counter出力し、3 を出力します。

于 2012-10-11T11:54:59.000 に答える