C#/Java 如何存储二维数组,与 C++ 不同?

Posted

技术标签:

【中文标题】C#/Java 如何存储二维数组,与 C++ 不同?【英文标题】:How C#/Java stores 2D array, it's different with C++? 【发布时间】:2016-07-22 04:36:02 【问题描述】:

据我所知,C++ 通过将二维数组值放在一块内存(连续虚拟内存?)上来存储数组,这对于按索引访问值来说很快。

我在读完这篇文章后提出了这个问题,“使用嵌套数组存储 2D 网格在 C/C++ 中是有效的,但在 Java 或其他内存管理语言中,这样做实际上会给你一个行数组,其中每个元素是对列数组的引用,它可能不像你想要的那样对内存友好”。

“对列数组的引用”是否意味着它们实际上存储在内存中的许多小块中?

更新

抱歉,我的问题应该是“如果 Java 在许多小块上存储 2D 数组,那么‘内存管理’怎么这么容易?

【问题讨论】:

写这句话的人可能在想int[][],它确实是一个数组数组。这就是 Java 中的全部内容,但在 C# 中还有一个 int[,],它是一个矩形数组 - 一块连续的内存。 “对列数组的引用”是否意味着它们实际上存储在内存上的许多小块中? -- 是的(在 Java 中),但是这里的优缺点是什么? - 请完善您的问题,因为它只是征求意见而没有特定方向,这不适合 SO。 不,这意味着 Java 中没有“真正的”二维数组(可能还有 C#)。相反,Java 可以有数组数组,其中数组 1 的每个索引(行)都是数组本身(列)。这也意味着,列可以是锯齿状的。 您也可以添加具有这些功能之一的每种语言。真的是每一种语言。 @Tom 不,Jon Skeet 说得对(像往常一样),你绝对可以在 C# 中创建一个真正的二维数组。 【参考方案1】:

在一个 MxN 矩阵中,它有 N 个数组的 M 个引用。这就是为什么在 C 中,当你想将数组作为函数参数传递时,你必须告诉第二维,而在 Java 中你不必这样做。

【讨论】:

以上是关于C#/Java 如何存储二维数组,与 C++ 不同?的主要内容,如果未能解决你的问题,请参考以下文章

如何将数据存储在动态二维数组中,该数组在 C++ 中的另一个结构中也使用的结构中声明

c语言问题:c语言中二维数组在内存中怎样存储?

C++ 练气期之二维数组与矩阵运算

利用c++中的vector创建动态二维数组

如何将 numpy 二维数组作为一种可以用 C++ 读取的二进制格式存储到磁盘上

C++二维数组给一维数组赋值