2

私はこのトピックを同様のStackOverflowスレッドで見つけました。

C ++では、配列int [i] [j]を作成すると、行のメジャーオーダーが取得されるため、行ごとに反復すると、より有用なデータを含むキャッシュが得られます。

Javaには、2D配列はありませんが、キャッシュに関しては十分に類似したものを作成します。私の質問は、実際のデータの配列を行のサイズで作成するのか、それともポインタの配列を行のサイズで作成するのかということです。

または、同様のStack Overスレッドのトップアンサーが言ったように、int [5] [8]が(5 * 8)になる任意のサイズの配列への5つのポインターの配列になるというまったく異なることをしますか? ?

javaはジャグ配列を作成すると言っていましたが、これが真実である正当な理由は考えられません。

4

1 に答える 1

2

Javaには、2D配列はありませんが、キャッシュに関しては十分に類似したものを作成します。

C ++の動作についてはわかりませんが、Javaの動作に何かを期待しているようですが、そうではない可能性があります。あなたが書く場合:

int[][] x = new int[5][8];

その場合、それは次と同等です。

int[][] x = new int[5][];
x[0] = new int[8];
x[1] = new int[8];
x[2] = new int[8];
x[3] = new int[8];
x[4] = new int[8];

ここには6つの個別のアレイがあります。いつでも、次のように書くことができます。

x[2] = new int[10000];

これは単なる配列の配列であり、定義上ギザギザになっています。それが永遠に長方形のままである、あるいは「トップレベル」配列のすべての要素が非ヌルになると言うことは何もありません。

値はメモリ内で互いに近くから始まると思いますが、そのようにとどまるという保証はありません。

連続したメモリブロックがあることを本当に確認したい場合は、int[] x = new int[40];代わりに使用する必要があります。

于 2013-01-29T20:57:49.637 に答える