2012-01-13 23 views
-1

は、私は、単一次元の場合C:二次元配列が一次元より遅い?

a[i]=*(a+i), 

のように何らかの形で実装されているので、[i] [j]が

*(a+i*ROWSIZE+j) 

は私が間違ってなければならないこと、考えましたか?

http://habrahabr.ru/blogs/algorithm/135948/

Думаю、нестоитговоритьотом、чтоодномерныймассивбыстреедвумерного、атакже、чтостатическиймассивконстантнойдлиныбыстреединамическогоのstd ::ベクトルここで読む

+1

あなたの質問は仮定をたくさん持っていると漠然とへくらいです。あなたは2D配列があなたのために何であるかを詳しく述べていただけますか?標準では、2D配列は 'int a [3] [4];のように宣言されたものです。これはあなたの頭にあるものですか?または、2D配列をエミュレートするポインタ配列を意味しますか?遅いとはどういう意味ですか? –

答えて

0

正しいですが、入力するときれいになるかもしれません: a[i*ROWSIZE + j]を使用して、ポインタをオフセットするのではなく、配列にインデックスを付けることを明確にします。

3

「遅い」とはどういう意味ですか?実際のアクセス時間(メモリからデータをフェッチするために必要な時間)に関しては、それらは同じものではありません。オフセットを計算するのに必要なナノ秒という点では、2Dは最小のオーバーヘッドを追加します。

1

いいえ、タイトルはあなたの質問に関連していないようですが、 aを想定Cで

0

アレイとij整数の配列は、次いで式中、

a[i][j] 

int a[ROW][COL]; 
、所与例えば

*(*(a+i)+j) 

と等価です

の場合、式:

a[i][j] == *(*(a+i)+j) == *(a[i] + j) == *((int *) a + i * COL + j) 
+2

は、各a [i]がそれ自身が配列への参照である場合に限ります(ここでは、単一のメモリブロックです)。 –

0

実際には、どのように宣言されているかによって異なります。ご指摘のよう - - インデックスへの乗算を必要と

は、少なくとも二つの可能性

int a[4][4]; 

4 * 4 *のはsizeof(int型)バイトを割り当て、

があります。

他のオプションは

int **a; 

ある - 初期化 - 他の1次元配列へのポインタの1次元アレイです。

つまり、a [i]は実際の行へのポインタを返し、追加された[j]はその行の正しい値を返します。

これはインデックスを作成するための乗算を必要としません。

2

aが多次元配列の場合は正しいです。それは同じことです。
a[i][j]という構文を使用して、ポインタの配列をインデックスすることもできますが、これは別のものです。

だから、の定義に依存:

char a[N][M]; // Behaves as you describe 
char *b[N];  // b[x][y] reads twice from memory.