多次元配列を使用するとパフォーマンスが低下するため、は1次元配列として格納されます。
あなたの混乱は、多次元配列とそれらをどのように表現できるかに関する用語の違いに起因していると思います。
Cでは、配列はポインタの間接参照を介してアクセスされます。
int arr[10];
arr[5] <--> *(arr+5)
実際、インデックス演算子はo[i]
完全に同等であり、同じ式を生成するため、*(o+i)
実際に書くこともできます。i[o]
したがって、インデックス演算子はポインタ演算と逆参照を行います。これは、Cマルチディムアレイにとって何を意味しますか。
int marr[10][10];
int (*row)[10] = marr[5] <--> *(marr + 5);
mrow[5] = *(mrow + 5) <--> marr[5][5];
そして、これを好きなだけ次元に拡張することができます。したがって、C言語では、多次元配列は複数のポインター逆参照を通過します。これは、データがメモリ内で連続しておらず、実際には行ごとにサイズが異なる可能性があることを意味する場合もあります。そしてそれが彼らが非効率的である理由です。Cはこれを実行し、列ポインターと行の動的割り当てを可能にします。
ただし、多次元配列を格納するもう1つの方法は、フラットストレージモデルです。つまり、すべての要素を1つの値の文字列に連結するだけです。そして、あなたが知っている寸法を導入することによって、このストリングをどこでカットして再配置するか。
int fmarr[10*20*30];
int at1_2_3 = fmarr[1*30*20 + 2*20 + 3];
ご覧のとおり、すべてのサイズは静的であり、データは連続しています。ポインターの逆参照はありません。これにより、データの操作がはるかに簡単になり、さらに重要なことに、操作のベクトル化が可能になります。これにより、パフォーマンスが大幅に向上します。