86.引用对象成员内存位置
86.1 题目
class Test
{
public int i;
public string str;
}
class Program
{
static void Main(string[] args)
{
Test test = new Test();
test.i = 42;
test.str = "Hello";
}
}
请问这段代码中,test对象,test.i以及test.str 存储在栈上还是堆上?
86.2 深入解析
局部变量 test 位于当前栈帧(或寄存器),其值为托管堆上 Test 实例的引用。Test 实例及其实例字段均在托管堆上:
其中的test.i的值42会存储在test对象的内存块中
其中的test.str存储的是 在堆中的常驻字符串区域中存储的Hello的引用
86.3 答题示例
这里
test变量本身是在栈上分配的,它保存的是对堆上new Test()对象的引用。
Test实例连同它的字段都分配在 托管堆 上:
- 字段
i(值类型)直接存储在堆上对象的内存块里,值为42。- 字段
str(引用类型)存储一个引用,该引用指向驻留在托管堆中(或常量池里)的字符串对象"Hello"。
86.4 关键词联想
- 栈(Stack)
- 堆(Heap)
- 值类型 vs 引用类型
- 引用变量
- 字符串驻留/常量池
- CLR 内存模型
- 对象实例分配
- 字段布局
- 托管堆
- 内存分配与垃圾回收
转载请注明来源,欢迎对文章中的引用来源进行考证,欢迎指出任何有错误或不够清晰的表达。可以在下面评论区评论,也可以邮件至 785293209@qq.com