【发布时间】:2014-08-07 01:31:22
【问题描述】:
我正在犹豫如何组织我的 2D 数据的内存布局。
基本上,我想要的是一个 N*M 2D double 数组,其中 N ~ M 有数千个(并且来自用户提供的数据)
在我看来,我有两个选择:
double *data = new double[N*M];
或
double **data = new double*[N];
for (size_t i = 0; i < N; ++i)
data[i] = new double[M];
第一个选择是我倾向于的。 我看到的主要优点是更短的新/删除语法,如果我正确安排访问,连续内存布局意味着运行时相邻的内存访问,以及矢量化代码可能更好的性能(自动矢量化或使用矢量库,如 vDSP 或 vecLib)
另一方面,在我看来,与分配一堆较小的内存相比,分配一大块连续内存可能会失败/花费更多时间。而且第二种方法还具有data[i][j]与data[i*M+j]相比语法更短的优势
最常见/更好的方法是什么,主要是如果我尝试从性能的角度来看它(即使这些会是小的改进,我很想知道哪个会更好)。
【问题讨论】:
-
N和M是常量吗? -
为什么不创建一个包含
std::vector的类,重载operator()(size_t i, size_t j)以供访问。 -
不知道为什么用 C 标记,好像
malloc和类似的答案会被接受或任何东西。 -
@jxh : 不,N 和 M 来自用户提供的数据
-
@ThoAppelsin :如前所述,我关心的只是内存布局和性能影响,而不是精确的语法。任何直接处理指针的语言的任何解决方案都适合我(也可以使用伪代码)。在这种情况下,C 语言似乎很重要。重新标记...
标签: c++ c arrays pointers data-structures