当++计数器出现时,内存中会发生什么?

时间:2012-10-11 11:36:49

标签: c# c#-4.0

假设我有:

int counter;
++counter;

问题是:内存(堆栈)中发生了什么? 如果在堆栈中创建了一个新变量并复制了上一个变量的值并添加了+1或者使用临时变量,那么在那里添加+1然后在计数器中放置新值?

5 个答案:

答案 0 :(得分:7)

counter的值从内存加载到CPU寄存器中,递增,然后写回到相同的内存地址。在此过程中没有分配额外的内存,如果counter存在于堆栈中或其他任何位置,它就没有任何区别。

答案 1 :(得分:3)

这取决于,但通常没有发生在内存中。抖动所做的最重要的工作之一是尽可能避免使用内存。特别适合像你这样的局部变量。它将变量的值存储在CPU寄存器中。 ++运算符只是生成一个INC机器代码指令来递增寄存器中的值。速度非常快,需要0或1个CPU周期。 0是常见的,因为它可以与另一条指令并行执行。

请参阅this answer以获取抖动执行的优化列表。

答案 2 :(得分: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指令。

答案 3 :(得分:0)

++ counter将递增计数器并返回新的递增值。 counter ++将递增计数器并返回增量前的值。

答案 4 :(得分:0)

这是Jon的回答。

在变量之前和变量之后使用++运算符时有一个区别。请考虑以下示例:

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

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

counter++将打印1,++counter将打印3。