2012-02-14 11 views
1

私の本は単一のベクトルを使う方が速いと言うので、しばしばすべての行列を1つのベクトルに覚えています。行列へのアクセスは時間がかかります。 私はこの1つのようなコードがある場合:メモリの連続した位置にある行列

int main(int argc, char **argv) 
{ 
    int mat[10][10],i; 
    for(i=0;i<10;i++) 
     mat[i][0]=99; 
    int *ptr=&mat[0][0]; 
    for(i=0;i<10;i++) 
    { 
     printf("%d\n",*ptr); 
     ptr+=10; 
    } 
    return 0; 
} 

は、私は4/5回それを実行しようとしたが、すべての時間が10倍99だから、また、マトリックスは、メモリのcontigous位置に記憶されている 出力しますか?常に? 「はい」の場合は、ベクターへのアクセスが速いのはなぜですか?

+0

「マトリックス」と「ベクター」の意味を明確にすることはできますか?できるだけ早く回答しましたが、私はあなたのサンプルプログラムに基づいて何を意味するかを推測しています。 –

+0

2Dアレイおよび1Dアレイ。 –

答えて

1

アレイは連続したメモリに格納されており、matは配列の配列なので、連続したメモリにも格納されます。私は1つのインデックス(あなたがいくつかの1D配列を分離しているとき)によって逆参照することは、2つのインデックス(マトリックスで)によって逆参照するより少し速いかもしれないと思うが、その違いはあまりにも心配するほど小さい。他の言語で、それは彼らに多次元と呼ばれるように

+0

1D配列の2D配列をエミュレートする場合は、とにかくインデックスを計算する必要があります。明示的にするかコンパイラで行うかは、おそらく違いはないようです。 –

+0

私は質問から理解していない1D配列を持っていることを理解していて、1次元配列でそれらをエミュレートしたいと考えています。その場合、コンパイラは最初のインデックスを計算しないことがあります。 (vlaについて考える) – asaelr

2

「行列」によって2次元配列を意味する場合、それらは連続したメモリにあります。 Cの2次元配列は配列の配列です(行長)。ベクトルで1次元配列を意味する場合、2D配列にアクセスするよりも速くすべき理由はありません。

1

Cには多次元配列を持っていないが、彼らは本当に配列の配列です。

C配列は連続しています。

(C99は、6.2.5p20)「配列型は、要素型と呼ばれる特定のメンバオブジェクトタイプのオブジェクトの連続的に割り当てられた空でない集合を記述しています。」

関連する問題