0

double のリストのリストのリストのリストのリストであるこの大きなデータ構造があります。明らかに、処理するのは非常に非効率的です。アプリケーションの実行に費やされる時間の約 70% は、リストの末尾にある double にゼロを書き込むために使用されます。次の 2 つの制約を満たす、より高速な置換が必要です。

1)すべてのメモリを継続的に割り当てる必要があります(つまり、メモリの巨大なチャンク)

2) 通常の A[][][][][] 構文を使用して、このチャンクにアクセスする必要があります

今のところ、*double を使用してチャンク全体を保持し、... のリストのリストを再利用して、チャンク内の適切な領域へのポインターを格納することを考えました。

より良いアイデアはありますか?

4

1 に答える 1

0

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]のどちらでインデックスを作成するかを決定できます。メモリは連続しており、2つの割り当てだけで済みます。もちろん、これにはメモリ内の空きn * m * sizeof(double)ブロックも必要ですが、メモリを継続的に割り当てる必要があるため、これが満たされることを期待しています。これは、次のコマンドで正しく削除する必要があることも意味します。

free(a[0]);
free(a);

したがって、これを簡単にするために、create5Darray(n、m、k、l、t)とdelete5Darray関数を作成します。

于 2012-04-11T08:46:58.203 に答える