2

多次元配列についていくつか質問があります。それらにメモリを割り当てる方法は理解していますが、なぜ必要なのかわかりません(物事を読みやすくする以外に)。

配列の[]演算子がオーバーロードされていますね。では、メモリの単一ブロックを割り当ててアクセスを許可できないのはなぜ1dArray[i*nInRow][offset]でしょうか?

多次元で配列を使用することにより、さらにパフォーマンスが向上しますか? また、メモリが 2 次元配列に動的に割り当てられる場合、それらは連続した場所に格納されますか、それともヒープに散在しますか? データが要求されたとき、すべてがメモリからブロックとしてプルされると想定できますか?

私が見た情報のほとんどは、構文を説明しただけです。答えや提案された読書は素晴らしいでしょう。

4

3 に答える 3

2

配列の [] 演算子がオーバーロードされていますね。では、1dArray[i*nInRow][offset] によってメモリの単一ブロックを割り当ててアクセスを許可できないのはなぜでしょうか?

それは可能であり、実際、私は一般的なケースでこれをお勧めします.

多次元で配列を使用することにより、さらにパフォーマンスが向上しますか?

あまり。レイアウトによっては、キャッシュ ヒットを最適化できますが、平坦化された 1D 配列でもまったく同じことが当てはまります。2 つの間のメモリ レイアウトは (通常) まったく同じです。唯一の違いは、配列のセマンティックタイプと、2D 要素のルックアップを自分で実装する必要があるという事実です。

また、メモリが 2 次元配列に動的に割り当てられる場合、それらは連続した場所に格納されますか、それともヒープに散在しますか? データが要求されたとき、すべてがメモリからブロックとしてプルされると想定できますか?

配列は常に連続しています。

ただし、実際には 2D 配列を割り当てていることに注意する必要があります。一部の人々はint** ptr = new int*[2]、各「サブ配列」を手動で作成して割り当て、2D配列があると考えています。彼らはしない。それらにはポインターの配列があり、それが「散らばった」レイアウトを取得するときです。あなたの 2D 配列はint (*ptr)[3] = new int[2][3];です。

于 2012-11-07T16:29:52.003 に答える
0

まず第一に、多面的な問題があります。次に、多次元の問題が「まばら」である場合、99*99*99*99*...*99 個の要素を割り当てるのは意味がありませんが、巧妙な構文配列によって隠されている次のレベルの構造へのポインターのみを割り当てます[ n][i][j][k]...

たとえば、仮想メモリとページ テーブルは、最新の OS と CPU でそのように動作します。

于 2012-11-07T16:31:30.783 に答える
0

2 次元配列には次の 2 種類があります。

1) すべてのメモリが 1 つの大きなブロックにある種類、および

2)すべての行(またはすべての列)が連続しているが、個々の行が散らばっていて、各行を指すポインターの配列がある種類。

タイプ #2 は、2 つのポインターを交換するだけでよいため、行の交換などの特定の操作を実行する場合にパフォーマンスが向上します。

于 2012-11-07T16:31:35.060 に答える