c++ - 内存布局 : 2D N*M data as pointer to N*M buffer or as array of N pointers to arrays

标签 c++ c arrays pointers data-structures

我在犹豫如何组织我的 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]

语法更短的优点

最常见/更好的方法是什么,主要是如果我尝试从性能的角度来看它(尽管这些改进会很小,但我很想知道哪种性能更好)。

最佳答案

在前两个选择之间,对于 MN 的合理值,我几乎肯定会选择选择 1。你跳过指针取消引用,你会变得很好如果您以正确的顺序访问数据,则缓存。

根据您对尺寸的担忧,我们可以进行一些粗略计算。

因为 MN 以千为单位,假设每个都是 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/

相关文章:

python - 为什么我无法检测到元组为空?

ruby-on-rails - 将哈希列表转换为方法的参数

C++ 类型标识符

c++ - 如何连接字符串并传递给 system() 调用?

c# - 将窗口的 SetParent() 设置为 SHELLDLL_DefView 是否安全?

c - 返回指向未知大小的数组的指针并将其提升到所需的长度

C 在参数类型为 int** 的情况下将 int* 作为参数会发生什么情况?

c++ - 删除类内部成员函数中的对象

c - 如何将无符号转换为 uint64_t?

c - 如何将数组作为参数传递给C中的函数?