[英]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
是一個數組數組,而i
和j
整數則在表達式中,
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.