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++ 中的另一个结构中也使用的结构中声明