2D数组如何存储在内存中?
我想到了以下方法,其中行存储为连续的内存块。
|的 _ __ _ __ _ __ || _ __ _ __ _ __ | 的 的 __ _ __ _ __ | 的 _ __ _ 的__ _ _ | ... | _ __ _ __ _ __ < /强> |
元素的加入类似于(i,j) - &gt; n * i + j,其中n是矩阵的维数(假设它是nxn)。
但是,如果我想添加一个新列怎么办?我必须更新每一行中的每个第(n + 1)个元素,并将它们移到右边,但这在计算上太贵了。
另一种选择是将矩阵复制到新位置,并使用新列的元素动态更新行。但如果阵列很大,这也不太有效。
最后我想到的第三个选项是为每一行分配固定数量的内存,当我添加一个新列时,我不必将行向右移动。
我不能在内存中留有空白,所以所有的块都必须是连续的。
我不是要求使用指针和实际RAM内存的C实现,我只是对在内存中存储动态2d数组的理论方法感到好奇,因为它很容易附加新行或者它的列。
还有其他更有效的方法吗?
答案 0 :(得分:4)
如果您知道要创建要扩展的2D阵列,则一种方法是在每个维度中分配更多大小。跟踪实际大小和分配的大小,当实际大小超过分配大小时,请执行以下操作:
这将是分配动态1D阵列的常用技术的2D扩展。
答案 1 :(得分:1)
如果您需要扩展数组并在内存中连续,实现此目的的一种方法是简单地使用1d数组并“伪造”第二维。
如果您的初始1d阵列比所有2d阵列所需的空间更多,则不需要在内存中移动(可能避免间隙)。但是,根据您实现它的方式,一个使子阵列之一生长的插入可能需要将后面的元素向下移动(您的阵列中也可能存在间隙,但我认为这违反了您的无间隙要求)。
如果你确实需要2个维度,那么greg的答案是要走的路。 如果您知道数据的大小,那就更容易了。