假设我有:
int counter;
++counter;
问题是:内存(堆栈)中发生了什么? 如果在堆栈中创建了一个新变量并复制了上一个变量的值并添加了+1或者使用临时变量,那么在那里添加+1然后在计数器中放置新值?
答案 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。