C:二维数组比单维慢?

时间:2012-01-13 19:33:08

标签: c arrays

我想,如果以某种方式实现单维,就像

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

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

*(a+i*ROWSIZE+j)

我错了吗?

请阅读http://habrahabr.ru/blogs/algorithm/135948/

  
    

Думаю,нестоитговоритьотом,чтоодномерныймассивбыстреедвумерного,атакже,чтостатическиймассивконстантнойдлиныбыстреединамического的std ::矢量

  

6 个答案:

答案 0 :(得分:3)

我不完全确定你的意思是“慢”。就实际访问时间(从内存中获取数据所需的时间)而言,这些都不相同。就计算偏移所需的纳秒数而言,是的,2D会增加最小的开销。

答案 1 :(得分:2)

如果a是一个多维数组,那么你是对的。这是一回事。
但是a[i][j]语法也可以用来索引一个指针数组,这是另一回事。

所以这取决于a的定义:

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

答案 2 :(得分:1)

不,虽然您的标题似乎与您的问题无关。

答案 3 :(得分:0)

你是对的,但输入可能更清晰: a[i*ROWSIZE + j]清楚地表明您正在索引数组而不是仅仅偏移指针。

答案 4 :(得分:0)

在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)

答案 5 :(得分:0)

实际上,这取决于声明的方式。

至少有两种可能性

int a[4][4];

分配4 * 4 * sizeof(int)字节,并且 - 正如你所指出的 - 需要乘法来索引。

另一个选项是

int **a;

- 初始化时 - 是指向其他单维数组的指针的单维数组。

也就是说,a [i]返回指向实际行的指针,添加的[j]返回行中的正确值。

这不需要任何乘法索引。