【问题标题】:C# Does an array of objects store the pointers of said objects?C# 对象数组是否存储所述对象的指针?
【发布时间】:2015-09-23 20:25:03
【问题描述】:

肯定有这样的问题,但我找不到 - 也许我的措辞有误。我的所有搜索都导致了有关如何在 C# 中使用数组的文章。

一点背景知识:我正在尝试将许多对象加载到一个数组中。我想知道数组是否会由于指针过多或数组中累积对象的大小而出现 OutOfMemory 异常。我知道对象在 .NET 中具有固有的 2 GB 大小限制,但它是否源于数组中的对象本身?

例如,如果我在数组中有 n 个对象,那么该数组的内存大小是 n * sizeof(object) 还是 n * sizeof(pointer)?

【问题讨论】:

    标签: c# arrays pointers


    【解决方案1】:

    如果您担心 OutOfMemoryException,请在此处查看答案:https://stackoverflow.com/a/1088044/87464

    话虽如此,一个 2GB 的引用类型数组,即使是 64 位 系统,是一个庞大的对象。即使有 8 个字节的引用,你 能够分配一个包含 268,435,456 个对象引用的数组 - 每个都可以非常大(最多 2GB,如果使用嵌套对象则更多)。这比实际需要的内存更多 大多数应用程序。

    .NET 公共语言运行时团队的成员发布了一篇关于数组内存限制http://blogs.msdn.com/b/joshwil/archive/2005/08/10/450202.aspx 并使用 BigArray 解决任何大小限制的深入博客文章

    【讨论】:

      【解决方案2】:

      如果对象是值类型,那么它将实际对象存储在数组中,并且数组的大小是 n * 对象的大小。如果类型是引用类型,那么数组将存储对其他地方的对象的引用,并且数组的大小是 n * 指针的大小。

      【讨论】:

        【解决方案3】:

        数组简单地由元素类型的 N 个槽组成。如果元素类型是引用类型,则数组存储引用(最初都是null)。 ref 和 value 类型的元素没有特殊情况。

        数组“内联”保存引用类型对象在逻辑上是不可能的。如果这些类没有默认构造函数怎么办?那你就不能实例化这样的数组了。

        【讨论】:

          猜你喜欢
          • 2020-07-07
          • 2016-03-26
          • 2020-10-02
          • 1970-01-01
          • 2011-02-12
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多