86.引用对象成员内存位置

  1. 86.引用对象成员内存位置
    1. 86.1 题目
    2. 86.2 深入解析
    3. 86.3 答题示例
    4. 86.4 关键词联想

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

×

喜欢就点赞,疼爱就打赏