Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/20.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 在记忆的条件中有文字意味着什么?_C#_.net_Garbage Collection_Clr - Fatal编程技术网

C# 在记忆的条件中有文字意味着什么?

C# 在记忆的条件中有文字意味着什么?,c#,.net,garbage-collection,clr,C#,.net,Garbage Collection,Clr,给出以下示例: //this gets allocated var foo = 42; //what happens to 0? if (foo > 0) { } 奇怪的是,0在内存消耗/指令方面会发生什么变化 我一直认为,这是一些指令,是发射到处理器和忘记。不需要存储在RAM中的任何内容(只要它是文本而不是引用) 参加了这次活动后,我有点困惑 0是否以某种方式分配到内存中?它需要被垃圾收集吗?有没有一种文字可以改变这种情况 引擎盖下发生了什么 //this gets allocate

给出以下示例:

//this gets allocated
var foo = 42;

//what happens to 0?
if (foo > 0)
{
}
奇怪的是,
0
在内存消耗/指令方面会发生什么变化

我一直认为,这是一些指令,是发射到处理器和忘记。不需要存储在RAM中的任何内容(只要它是文本而不是引用)

参加了这次活动后,我有点困惑

0
是否以某种方式分配到内存中?它需要被垃圾收集吗?有没有一种文字可以改变这种情况

引擎盖下发生了什么

//this gets allocated
var foo = 42;
“分配”这个词并不正确;这是堆栈上本地的值类型;它本身不是一种“分配”。它只是ldc.i4 42,
stloc.0

//what happens to 0?
if (foo > 0)
{
}
再说一次,这不是分配;没有什么可收集的;这只是
ldloc.0
ldc.i4.0
cgt
brfalse.s
。没有拨款。这里的所有内容都只是堆栈上的值。GC指的是托管堆,即对象

在实现方面:输入方法会在堆栈上保留已知数量的空间(由编译器计算)。保留该方法不起任何作用-它保持内存不变,只是从正在使用的堆栈空间中减去相同的数字

所以
0
以与
foo
相同的方式存储在堆栈上


不完全一样
foo
是一个局部变量,
0
是一个瞬态变量。基本上,局部变量首先出现,然后瞬态堆栈空间在局部变量之后开始。瞬态堆栈空间用于进行中的操作(至少在理论上-JIT可以注册它),包括加载文本值。临时区域只是非正式定义的(JIT理解它,但没有正式声明),并且只在单个操作期间持续。每个方法范围都有局部变量。

非常感谢。因此,
0
以与
foo
相同的方式存储在堆栈上?@ChristianGollhardt不完全相同
foo
是一个局部变量,
0
是一个瞬态变量。基本上,局部变量首先出现,然后瞬态堆栈空间在局部变量之后开始。瞬态堆栈空间用于进行中的操作(至少在理论上-JIT可以注册它),包括加载文本值。临时区域只是非正式定义的(JIT理解它,但没有正式声明),并且只在单个操作期间持续。局部变量是每个方法范围的。