0

私は基本的なアーキテクチャベースの質問があります。多次元配列はどのようにメモリにレイアウトされますか?これはデータレイアウトがメモリ上で直線的に正しいのでしょうか?それは、行の主要な順序のデータストア行の順序(最初の行のストア、次に2番目の行...)に基づいて、列の主要なデータストアの列に基づいて正しいですか?RAMメモリのデータレイアウトはどのようになっていますか?

ありがとう

答えて

1

配列の表現はプログラミング言語によって異なります。ほとんどの言語(C中絶とその子孫は注目に値する例外です)は、記述子を使った配列を表しています。記述子は、各ディメンションの上限と下限、およびデータが配置されているディメンションの数を指定します。

通常、配列のすべてのデータは連続して格納されます。連続して格納されている場合でも、順序は言語に依存します。いくつかの言語では[0、0、0]は[1,0,0]の横に格納されています(Column Major、例:FORTRAN))。他のものでは、[0、0、0]は[0、0、1]の次にあります(そして、[0,0,0]と[1,0,0]は離れた行の長さです(例えば、パスカル)。 Adaなどの一部の言語では、コンパイラの実装まで注文が残されます。

1

各アレイは自然に順番に格納されます。データをその場に広めることは意味がありません。 Cで

例:もちろん

int matrix[10][10]; 
matrix[9][1] = 1234; 
printf("%d\n", matrix[9][1]); // prints 1234 
printf("%d\n", ((int*)matrix)[9 * 10 + 1]); // prints 1234 

あなたは、あなたがそれを行うことができます混乱を作りたい場合は、この方法でデータを整理するために強制は何もありません。例えば

、代わりに配列の配列を使用してのあなたは動的に行列を割り当てることにした場合:

int **matrix; 
matrix = malloc(10 * sizeof(int*)); 
for (int i = 0; i < 10; ++i) 
    matrix[i] = malloc(10 * sizeof(int)); 

上記の例では、最も可能性の高い、まだ順番に格納されているが、確かではない連続的な方法である、なぜなら割り当てられた11の異なるメモリブロックがあり、メモリマネージャは、それが意味を成すどこにでもそれらを割り当てることが自由である。

関連する問題