我有这个大数据结构,它是一个列表列表列表列表列表的列表。显然,它的处理效率极低。运行我的应用程序所花费的大约 70% 的时间用于在列表末尾的双精度中写入零。我需要一个满足两个约束的更快的替换:
1)所有内存必须连续分配(即一大块内存)
2)我必须使用通常的 A[][][][][] 语法访问这个块
至于现在,我想使用 *double 来保存整个块并重用我的列表列表 ... 来存储指向块中适当区域的指针。
有更好的想法吗?
我有这个大数据结构,它是一个列表列表列表列表列表的列表。显然,它的处理效率极低。运行我的应用程序所花费的大约 70% 的时间用于在列表末尾的双精度中写入零。我需要一个满足两个约束的更快的替换:
1)所有内存必须连续分配(即一大块内存)
2)我必须使用通常的 A[][][][][] 语法访问这个块
至于现在,我想使用 *double 来保存整个块并重用我的列表列表 ... 来存储指向块中适当区域的指针。
有更好的想法吗?
如何使用 2D 数组实现这一点的一个例子是,我懒得做 5D 案例,是
double **a;
a = malloc (n * sizeof(*double));
a[0] = malloc (n * m * sizeof(double));
for (int i = 1; i < n; ++i)
a[i] = a[0][i*n];
这样,您可以决定是否希望使用 a[0][i*n] 或 a[i][j] 对其进行索引。内存是连续的,您只需进行两次分配即可。当然,这也需要内存中有一个空闲的 n*m*sizeof(double) 块,但是由于您要求连续分配内存,我希望这会得到满足。这也意味着您必须使用以下方法正确删除它:
free(a[0]);
free(a);
所以我会创建一个 create5Darray (n,m,k,l,t) 和一个 delete5Darray 函数来简化它。