【问题标题】:What is the purpose of multidimensional arrays? [closed]多维数组的目的是什么? [关闭]
【发布时间】:2012-11-07 16:27:03
【问题描述】:

我有几个关于多维数组的问题。我了解如何为他们分配内存,但我不明白为什么需要(除了让事情更具可读性)。

数组的[] 运算符重载了,对吗?那么,为什么不能分配单个内存块并由1dArray[i*nInRow][offset] 授予访问权限?

在多个维度上使用数组是否会进一步提高性能?此外,当为二维数组动态分配内存时,它们是存储在连续的位置,还是分散在堆周围?当请求数据时,我可以假设所有内容都是从内存中作为一个块提取的吗?

我看到的大部分信息都只是解释了语法。任何答案或建议阅读都会很棒。

【问题讨论】:

  • 意大利面的用途是什么?
  • C++中多维数组的主要目的是迷惑初学者,产生层出不穷的关于如何动态分配、如何删除、为什么不能转化为指针等问题指向指针。

标签: c++ arrays 2d


【解决方案1】:

数组的 [] 运算符重载了,对吗?那么,为什么不能通过 1dArray[i*nInRow][offset] 分配单个内存块并授予访问权限?

可以,事实上我会在一般情况下推荐这个。

在多个维度上使用数组是否有进一步的性能提升?

不是真的。根据您的布局,您可以优化缓存命中,但对于展平的一维数组也是如此。两者之间的内存布局(通常)完全相同。唯一的区别是数组的语义 type 以及您现在必须自己实现 2D 元素查找这一事实。

另外,当内存为二维数组动态分配时,它们是存储在连续的位置,还是分散在堆周围?当请求数据时,我可以假设所有内容都是从内存中作为一个块提取的吗?

数组总是连续的。

您应该小心实际上分配一个二维数组。有些人写int** ptr = new int*[2] 然后手动分配每个“子数组”并认为他们有一个二维数组。他们不。它们有一个指针数组,当您获得“分散”布局时,就是。你的二维数组是int (*ptr)[3] = new int[2][3];

【讨论】:

  • 最后一点:是的,数组是连续的。在这种情况下,这意味着:指向数组的指针数组是连续的,因为指针是连续的,但不是(正如 OP 似乎要求的那样),因为内部数组是连续的。
  • @delnan:谁在询问指向数组的指针数组?你是第一个提到这些的人。
  • 我添加了一个段落来覆盖它以防万一。
  • “多维数组”被重载(正如其他答案所解释的那样)。您假设“它都是一个大块,在逻辑上被细分”(这是T a[n][m] ...; 声明的)。另一种解释,也叫多维数组,是锯齿状数组。
  • @delnan:我永远不会将锯齿状数组称为多维数组,原因很简单,它不是一个。
【解决方案2】:

首先,存在多维问题。 其次,如果多维问题是“稀疏的”,分配 99*99*99*99*...*99 个元素是没有意义的,而只是指向下一级结构的指针,这些结构被巧妙的语法数组隐藏 [ n][i][j][k]...

例如,虚拟内存和页表在现代操作系统和 CPU 中以这种方式运行。

【讨论】:

    【解决方案3】:

    二维数组有两种类型:

    1) 所有内存都在一个大块中的那种,并且

    2) 每一行(或每一列)都是连续的,但各个行分散在周围,并且您有一个指向每一行的指针数组。

    如果您想要执行某些操作(例如交换行),Type #2 具有更好的性能,因为您所要做的就是交换两个指针。

    【讨论】:

    • NB (2) 称为锯齿状数组。
    • @delnan 我不会称它为锯齿状数组,除非行长不同。
    • @Rook 一旦你使用了那个结构,它们可能会有所不同。如果它们永远不会有所不同,则没有理由这样做,除非您的语言/库使其中一种比另一种更方便。
    猜你喜欢
    • 2021-02-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-03-31
    • 1970-01-01
    相关资源
    最近更新 更多