【问题标题】:How is a dynamic 2D array stored in memory?动态二维数组如何存储在内存中?
【发布时间】:2012-02-02 18:43:31
【问题描述】:

二维数组如何存储在内存中?

我想到了以下方法,将行存储为连续的内存块。

|_________||_________|________|________ |...|_________|

元素的访问方式类似于 (i,j) -> n*i+j,其中 n 是矩阵的维数(假设它是 nxn)。

但是如果我想向其中添加一个新列怎么办?我必须更新每行中的每个 (n+1) 个元素并将它们向右移动,但这在计算上太昂贵了。

另一种选择是将矩阵复制到新位置并使用新列的元素即时更新行。但是如果数组很大,那也不是很有效。

最后我想到的第三个选项是为每一行分配固定数量的内存,当我添加新列时,我不必将行向右移动。

我不能在内存中有间隙,所以所有块必须是连续的。

我不是要求使用指针和实际 RAM 内存的 C 实现,我只是对在内存中存储动态二维数组的理论方法感到好奇,以便轻松追加新行或列给它。

还有其他更有效的方法吗?

【问题讨论】:

  • 您使用什么尺寸?我们说的是 1.000.000 个元素中的 10 个元素吗?

标签: c memory-management multidimensional-array


【解决方案1】:

如果您知道要创建一个将要扩展的二维数组,则一种方法是在每个维度上分配 更多 的大小。跟踪实际大小和分配的大小,当实际大小超过分配的大小时,执行以下操作:

  • 分配大小加倍
  • 将旧数组中的所有数据复制到新数组中
  • 释放旧数组

这将是分配动态一维数组的常用技术的二维扩展。

【讨论】:

  • 好主意,但我想知道这是否违反了他对内存连续的要求。
  • 该要求是在提出原始问题后添加的。我不知道“块”是指“特定行”还是“整个数据结构”。
  • 我的意思是我不能在内存中有间隙。假设我想将它存储在一个二进制文件中,我认为这将适合我的记忆场景。
  • 在这种情况下,您有几个选择: (1) 将内存存储在一个连续的块中,这意味着当您添加新列时必须重新排列所有内容; (2) 使用我建议的存储布局,但只将活动数据元素写入二进制文件; (3) 在你的二进制文件中允许有间隙(你需要一个标题来描述以下数据的形状)。
【解决方案2】:

如果您需要数组在内存中扩展并保持连续,实现此目的的一种方法是简单地使用一维数组并“伪造”第二维。

如果您的初始 1d 数组的空间比所有 2d 数组所需的空间多,则不需要在内存中移动(可能避免间隙)。但是,根据您的实现方式,使其中一个子数组增长的插入可能需要将后面的元素向下移动(您的数组中也可能有间隙,但我认为这违反了您的无间隙要求)。

如果您确实需要二维,那么 greg 的答案就是要走的路。 如果您一开始就知道数据的大小,那会更容易。

【讨论】:

    猜你喜欢
    • 2016-11-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-07-11
    • 2011-02-06
    • 2021-07-14
    相关资源
    最近更新 更多