我知道c#,就像Java一样,将源代码转换为字节码并由VM运行,因为C#案例是CIL存储在汇编中并由CLR执行.开发人员几乎不需要关心变量在堆栈上或堆上的位置(由GC处理)作为c ++,对吧?
他们是否有任何快速而直接的方式来证明变量存储在堆栈上或堆上?例如,如果我告诉某人,引用类型变量存储在堆上,或者本地值类型变量存储在堆栈上(对吗?).我怎样才能明确地表明这一点?在C++中,我可以获取变量的内存地址,并通过VS内存窗口查看存储在堆栈或堆内存中的值.
Eri*_*ert 23
开发人员几乎不需要关心变量在堆栈或堆上的位置,对吧?
对.为存储选择的技术是运行时的实现细节.
我注意到你已经省略了寄存器作为存储的可能选择.注册了很多变量,因此它们既不会堆栈也不会堆积.
更好的方法是考虑短期存储和长期存储.
是否有任何快速而直接的方法来证明变量存储在堆栈上或堆上?
尝试计算变量的生命周期.如果您可以轻松地这样做,并且生命周期小于或等于创建它的方法激活的持续时间,那么它很可能在短期池中.如果没有,它可能在长期池中.
在C++中,我可以获取变量的内存地址,并通过VS内存窗口查看存储在堆栈或堆内存中的值.
&操作员这样做可以改变存储变量的位置! 如果您获取变量的地址,则无法注册它,因为寄存器没有地址.改变它试图描述的内容的技术是一种不可靠的技术.
此外,您可能忘记了在C++中堆栈和堆不是唯一可能的存储位置.
例如,如果我告诉某人,引用类型变量存储在堆上,或者本地值类型变量存储在堆栈上(对吗?).我怎样才能明确地表明这一点?
由于这些语句是假的,你不能让他们在所有.简单地说,引用总是在堆上,并且值类型的局部变量在堆栈上.例:
void M()
{
string s = "";
...
Run Code Online (Sandbox Code Playgroud)
该空字符串是在长期的存储池,但空字符串没有存储在s在首位. 存储对空字符串的引用s.该引用可以放在短期池中.
请记住,引用类型的实际referants不变量都会在所有.引用类型的变量保存引用 - 这就是它们被称为引用类型的原因.
现在,引用类型的字段是变量,并且该变量没有已知的生命周期,因此该变量必须存在于长期存储池中:
class C { public int x; }
...
C M() { C c = new C(); return c; }
Run Code Online (Sandbox Code Playgroud)
x是值类型的变量,但因为它是属于引用类型的字段,所以它必须位于长期池中. c是引用类型的变量,因此它包含引用 ; 变量c的生命周期很短,因此c在短期池中也是如此.再次不要将引用与所引用的事物混淆.
例:
Action<int> M()
{
int x = 123;
return y => { x = y; Console.WriteLine(x); };
}
Run Code Online (Sandbox Code Playgroud)
本地变量x属于值类型,但您无法计算其生命周期,因此它必须位于长期存储池中.
由于你的声明引用类型的变量在堆上,而值类型的局部变量在堆栈上是错误的,所以没有办法证明它的真实性.
| 归档时间: |
|
| 查看次数: |
867 次 |
| 最近记录: |