gpt4 book ai didi

c# - 对象是如何存储在内存中的?

转载 作者:行者123 更新时间:2023-11-30 14:24:10 24 4
gpt4 key购买 nike

我正在尝试了解如何使用 .NET Framework 将对象存储在内存中。

给定以下 person 类:

public class Person
{
public string name { get; set; }

public int age { get; set; }
}

我相信 Person 类型的初始变量在内存中具有以下结构: Person Memory Structure

问题:

  • 首先,在我的理解中,他们是否有任何重大/明显的缺陷? (我几乎可以肯定存在,因为按照我描述的方式处理对象似乎效率低下;尤其是 name 指针指向字符串的 char 集合的方式成员(member))

  • 其次,对于类的值类型成员 (I.E Age),它们是存储在对象本身中(因此在与对象相同的内存地址中),还是它们获取自己分配地址,然后指向对象呢? (如我图所示)

  • 与上面的问题类似,但是对于引用类型的成员,对象是否持有指向指针的指针? (即在我的图表中引用 char 集合的名称指针)

  • 最后,如果我的 Person 类的成员是字段而不是属性,会有什么不同吗?

更新:根据 Sweeper 和 Tim 的回答更新了图表,我认为现在是正确的。

Correct Diagram

注意:指针更改为引用,因为这是托管代码。

最佳答案

在 .net 世界中,指针指向非托管内存,对象引用指向托管对象。垃圾收集器随时可能移动对象,因此指向它们的指针会在没有警告的情况下被销毁。概念是一样的,但还是有区别的,因为你确实可以在不安全的 C# 代码中使用指针。如果您捕获一个指向对象的指针,并且该对象移动,则您的指针指向任意内存空间。但是,对象引用会被保留。

关于年龄的问题。它存储在对象本身中,在结构中占用 32 位——而不是对 int32 的引用/指针

对于引用类型成员,它持有一个引用,这在概念上与指针相同,占用 64 位空间(或 32 位,具体取决于体系结构),但与我上面提到的有些不同。

最后,匿名属性实际上是在创建隐藏字段以及设置和返回这些字段的自动编写代码。存储是相同的,但通过属性而不是直接访问字段的成本非常低。

关于c# - 对象是如何存储在内存中的?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42316762/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com