0

要素の数値インデックスを知っているプログラミング言語では、配列要素へのアクセスが速いと言われています。これは、コンピューターのメモリが、各メモリスロットに数値アドレスを持つ配列のようなものだからだと思います。したがって、メモリアドレスがわかれば、そのアドレスに直接アクセスして、そこに格納されている値にアクセスできます。

そのメモリ位置はどのようにすばやくアクセスされますか? これはマイクロコードのレベルで行われますか?

4

1 に答える 1

0

ローカル変数は、実際には配列の最初の要素のメモリ位置を参照します。配列内の要素は固定サイズ (整数の場合はそれぞれ 4 バイトなど) であり、メモリの連続したブロックに順番に格納されます。要素のメモリ位置の計算はmemory location of first element + (size in bits of single element * index of element)、1 次元配列用です。計算で使用されるインデックスはゼロベースであることに注意してください。これが、ほとんどの言語が配列にゼロベースのインデックスを使用する理由です。配列の要素は、可変サイズのオブジェクト自体ではなく、要素のサイズを固定するためのオブジェクトへの参照である場合があります。

多次元配列の追加説明: 多次元配列内の要素の位置は、次を使用して計算できます。location of element [0][0] + (size of single element * (index for 1st dimension + (index for 2nd dimension * length of 1st dimension) + ... + (index for nth dimension * length of (n-1)th dimension * ... * length of 1st dimension)))カラムメジャーシステムで。列優先と行優先の 2 つのシステムがあります。 ビジュアライゼーションについては、このページを参照してください。 この計算は、ここでは複雑に見えますが、コンピューターにとってはかなり単純です。多次元配列は、配列の配列として実装することもできますが、これは少し遅くなり、メモリ効率が低下します。

範囲外のチェック: 要素位置の計算では、配列の長さよりも大きいインデックスが考慮されないため、配列外のメモリ位置にアクセスする可能性があります。C 言語はこれを防ぎません。Java は OutOfBoundsException をスローしますが、チェックが実行されるため、配列へのアクセスのコストがわずかに高くなります。範囲外チェックは、実装されている場合、言語固有です

于 2015-04-24T19:48:42.550 に答える