对象和字段内存分配[重复]

Posted

技术标签:

【中文标题】对象和字段内存分配[重复]【英文标题】:Object and fields memory allocation [duplicate] 【发布时间】:2019-07-25 01:21:06 【问题描述】:

我只需要简单说明一下对象的内存分配

假设我有以下课程:

public class Test
    
        public int a;

        public Test(int A)
        
            a = A;
        
      


////Main program


Test test1 = new Test(32);

Test test2 = test1;
test2.a = 5;

Print(test1.a.ToString());// output =5
Print(test2.a.ToString());// output =5

我的问题是:

我知道值类型是在堆栈中分配的,而引用类型是在堆中分配的。但是当一个对象被创建并且它有一个值类型字段时,是否会分配该字段?当我创建test1 的副本并将其分配给test2 时,两个对象都指向相同的内存位置,这是否意味着int a 在堆栈中只有一个副本,这就是为什么两个对象具有相同的输出5?。

【问题讨论】:

“值类型在堆栈中分配”是不正确的。 Here's an article by Eric Lippert on why Henk is correct 【参考方案1】:

在这种情况下,引用类型具有值类型。它被保存到对象的堆空间中。如果你仔细想想,它实际上与对象如何存储对其他对象的引用非常相似。在为对象内的值分配的空间中分配了一定数量的空间。

两个对象打印相同的原因是因为您有两个变量在内存中引用同一个对象。当我们引用对象int a 时,我们将从对象引用中获取A 的位置值。因为两个变量都指向同一个引用,所以 a 的位置在内存中是同一个位置,因此也是同一个值

【讨论】:

所以基本上值类型也会存储在堆中,在对象的同一个内存位置? 是的,为了清晰起见,我编辑了更多内容 太棒了,感谢所有有用的资源

以上是关于对象和字段内存分配[重复]的主要内容,如果未能解决你的问题,请参考以下文章

静态方法内存分配

内存分配

清除 R 会话分配的内存(gc()没有帮助!)[重复]

如何找出分配给 javascript 对象的内存量? [复制]

SIMD和动态内存分配[重复]

装箱与拆箱