多维数组在 C 和/或 C++ 中会导致任何问题吗?

Rob*_*rtS 4 c c++ arrays multidimensional-array array-difference

我知道这个问题乍一看有点好笑。但是当我遇到这个问题时,我\xc2\xb4ve发现了C和C++高级用户@BasileStarynkevitch评论,他在其中声称多维数组不应该更好地使用,无论是在C还是在C++中:

\n\n
\n

不要在 C++(或 C)中使用多维数组。

\n
\n\n

为什么?为什么\xc2\xb4t 我应该在 C++ 和 C 中使用多维数组?

\n\n

他这句话的意思是什么?

\n\n
\n\n

随后,另一位网友对此评论进行了回复:

\n\n
\n

巴塞尔是对的。可以在 C/C++ 中声明 3D 数组,但会导致太多问题。

\n
\n\n

哪些问题?

\n\n

我经常使用多维数组,并且认为使用它们没有任何缺点。相反,我认为它只有优点。

\n\n
    \n
  • 使用多维数组是否存在我不知道的问题?

  • \n
  • 谁能给我解释一下它们的意思吗?

  • \n
\n

MFn*_*Fnx 5

这是一个相当广泛(且有趣)的与性能相关的主题。我们可以讨论缓存未命中、多维数组初始化的成本、向量化、std::array堆栈上多维分配、堆上多维分配std::vector、对后两者的访问等等。

也就是说,如果您的程序可以很好地处理多维数组,请保持原样,特别是如果您的多维数组具有更高的可读性。

与性能相关的示例:

考虑 astd::vector包含许多std::vector<double>

std::vector<std::vector<double>> v;
Run Code Online (Sandbox Code Playgroud)

我们知道std::vector里面的每个对象v都是连续分配的。std::vector<double>此外,a in中的所有元素v都是连续分配的。然而,并非所有double存在的 都v位于连续内存中。因此,根据您访问这些元素的方式(多少次、以什么顺序……),与在连续内存中包含所有 的单个元素相比, std::vectorofstd::vector可能会非常慢。std::vector<double>double

矩阵库通常将 5x5 矩阵存储在大小为 25 的普通数组中。

  • *也就是说,如果您的程序可以很好地处理多维数组,请保持原样,特别是如果您的多维数组允许更高的可读性。* 这可能应该是这个答案的第一句话。为了任何事情而牺牲可读性几乎都不是一个好主意。 (2认同)