我在犹豫如何组织我的 2D 数据的内存布局。
基本上,我想要的是一个 N*M 二维 double
数组,其中 N ~ M 以千计(并且来自用户提供的数据)
在我看来,我有 2 个选择:
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 等 vector 库)
另一方面,在我看来,与分配一堆较小的连续内存相比,分配一大块连续内存可能会失败/花费更多时间。并且第二种方法还具有 data[i][j]
相对于 data[i*M+j]
最常见/更好的方法是什么,主要是如果我尝试从性能的角度来看它(尽管这些改进会很小,但我很想知道哪种性能更好)。
最佳答案
在前两个选择之间,对于 M
和 N
的合理值,我几乎肯定会选择选择 1。你跳过指针取消引用,你会变得很好如果您以正确的顺序访问数据,则缓存。
根据您对尺寸的担忧,我们可以进行一些粗略计算。
因为 M
和 N
以千为单位,假设每个都是 10000
作为上限。那么你消耗的总内存是
10000 * 10000 * sizeof(double) = 8 * 10^8
这大约是 800 MB,虽然很大,但考虑到现代机器的内存大小,这是相当合理的。
关于c++ - 内存布局 : 2D N*M data as pointer to N*M buffer or as array of N pointers to arrays,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25172879/