C#对象数组是否存储了所述对象的指针?

时间:2015-07-06 15:44:44

标签: c# arrays pointers

肯定有这样的问题,但是我找不到它 - 也许我说错了。我的所有搜索都引出了有关如何在C#中使用数组的文章。

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

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

3 个答案:

答案 0 :(得分:2)

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

答案 1 :(得分:1)

该数组只包含N个元素类型的插槽。如果元素类型是引用类型,则数组存储引用(最初都是null)。 ref与值类型元素没有特殊情况。

数组逻辑上不可能保存引用类型对象"内联"。如果这些类没有默认构造函数怎么办?然后你无法实例化这样的数组。

答案 2 :(得分:0)

如果您担心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来解决任何大小限制