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理解它,但没有正式声明),并且只在单个操作期间持续。局部变量是每个方法范围的。