簡體   English   中英

C:二維數組比一維數組慢?

[英]C: two-dimensional array slower then single-dimensional?

我認為,如果以某種方式實施一維

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

所以a [i] [j]必須是

*(a+i*ROWSIZE+j)

我錯了嗎?

在這里閱讀http://habrahabr.ru/blogs/algorithm/135948/

Думаю,нестоитговоритьотом,чтоодномерныймассивбыстреедвумерного,атакже,ттен

我不確定您所說的“慢”是什么意思。 就實際訪問時間(從內存中獲取數據所需的時間)而言,兩者都不相同。 就計算偏移量所需的納秒左右,是的,2D會增加最小的開銷。

如果a是多維數組,那么您是對的。 這是同一件事。
但是a[i][j]語法也可以用於索引指針數組,這是另一回事。

因此,取決於a的定義:

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

不,盡管您的標題似乎與您的問題無關。

您是正確的,但鍵入起來可能更干凈: a[i*ROWSIZE + j]可以清楚地表明您正在索引到數組中,而不僅僅是偏移指針。

在C中,假設a是一個數組數組,而ij整數則在表達式中,

a[i][j]

相當於

*(*(a+i)+j)

例如,

int a[ROW][COL];

然后在表達式中:

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

實際上,這取決於a的聲明方式。

至少有兩種可能性

int a[4][4];

分配4 * 4 * sizeof(int)個字節,並且-如您所指出的-需要乘以索引。

另一個選擇是

int **a;

它-初始化時-是指向其他一維數組的指針的一維數組。

即,a [i]返回指向實際行的指針,而相加的[j]返回該行中的正確值。

這不需要對索引進行任何乘法。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM