C# 中锯齿状数组的内存分配与 C++ 中的二维数组内存分配
Posted
技术标签:
【中文标题】C# 中锯齿状数组的内存分配与 C++ 中的二维数组内存分配【英文标题】:Memory allocation of Jagged arrays in C# vs 2d arrays memory allocation in C++ 【发布时间】:2018-07-14 07:43:12 【问题描述】:我有一个关于 C# 中的锯齿状数组的问题,当我在互联网上某处读到关于锯齿状数组的内容时,我认为 C# 中二维锯齿状数组的内存分配与 C++ 中二维数组的内存分配相同,因为2d 锯齿数组有一个指针数组,每个指针都指向一个元素数组(例如整数元素)我的意思是 C++ 中数组的内存分配如下:
int** twoDArr new int* [number1];
for (int i = 0; i < number1; i++)
twoDArr[i] = new int[number2];
与C#中二维交错数组的内存分配相同:
int[][] 2DJaggedArray = new int[number1][];
for (int i = 0; i < 2DJaggedArray.GetLength(0); i++)
2DJagggedArray[i] = new int[number2];
但我不确定,所以请您告诉我我是否正确,如果正确,您能否解释一下 C# 中二维数组的内存分配方式,例如下面的数组:
int[,] 2DArray = new int[number1,number2];
谢谢。
【问题讨论】:
我不认为 C++ 中的标识符可以以数字开头...代码可以编译吗? 复制:***.com/q/11575735/5267751 我编辑了那个。谢谢,但我的问题与上面链接中的问题不同,我确信在上面的链接中,C++ 和 C# 中数组的内存分配没有比较。 Two-dimensional array in memory的可能重复 不,因为在您提到的链接中,没有任何关于指针以及 C# 中的二维数组如何在内存分配过程中使用指针的解释。 【参考方案1】:是的,你是对的。 C# 中的锯齿状数组基本上是内存中的一维数组,其中每个元素只是一个引用。当您在for
循环中初始化数组时,它会在内存中的其他位置创建一个新数组,并且引用指向它。
如果是多维数组([,]
),情况就大不相同了。当你初始化这样的数组时,会创建一个内存块,它的大小等于数组所有维度的乘积。从技术上讲,大小为[M,N]
的多维数组在内存中的表示方式与大小为[M * N]
的简单数组相同。多个索引的访问基本上只是一个语法糖,框架通过乘以维度来计算元素的实际位置。
【讨论】:
感谢您的回答,这正是我想知道的。但是另一个问题仍然无法解释,那就是; Jagged数组的内存分配过程和C++多维数组一样吗? 不一样,但很相似。此处的不同之处在于整个过程由 .NET Framework 管理,因此例如在构建数组期间会在幕后进行额外的检查。但产生的内存分配非常相似。 当然可以。如果有帮助,请考虑接受答案作为解决方案,使其显示为已解决:-)。您可以通过单击灰色复选标记来执行此操作。 我知道“你的回答对我有帮助”真的很明显,但是有一个用户(user202729)真的没有帮助回答问题,只是因为他/她没有足够注意理解我的问题,我将被无缘无故禁止提问。 这个问题似乎是重复的,但是因为你更具体地解释了这个问题,所以不应该这样理解:-)。【参考方案2】:如果您要分配非常大的多维数组,c# 需要找到连续的内存而不是锯齿状数组。我们有一个场景,我们分配了过多的大型数组(1500*1500 = 250 万个双精度),并且 c# 会定期冻结 20-50 秒以进行垃圾收集。
【讨论】:
以上是关于C# 中锯齿状数组的内存分配与 C++ 中的二维数组内存分配的主要内容,如果未能解决你的问题,请参考以下文章