2012-01-13 4 views
-1

나는 단일 차원의 경우C : 2 차원 배열이 느린 다음 1 차원?

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

처럼 어떻게 든 구현 때문에 [내가] [j]가

*(a+i*ROWSIZE+j) 

은 내가 잘못 있어야한다는 생각?

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

Думаю, не стоит говорить о том, что одномерный массив быстрее двумерного, а так же, что статический массив константной длины быстрее динамического 표준 : : 벡터 여기 읽기

+1

귀하의 질문은 가정을 많이 가지고 있으며, 많은 모호이다. 2D 배열이 무엇인지 자세히 설명해 주시겠습니까? 표준에서 2D 배열은'int a [3] [4];와 같이 선언 된 것입니다. 이것은 당신이 염두에두고있는 것입니까? 아니면 2D 배열을 에뮬레이트하는 포인터 배열을 의미합니까? 천천히 당신은 무엇을 의미합니까? –

답변

0

정확하지만 입력하는 것이 더 깔끔할 수 있습니다. a[i*ROWSIZE + j]을 사용하여 포인터를 오프셋하는 대신 배열에 인덱싱하는 것이 분명해졌습니다.

3

"느린"이 무슨 뜻인지 잘 모르겠습니다. 실제 액세스 시간 (메모리에서 데이터를 가져 오는 데 필요한 시간)과 관련해서는 둘 다 동일하지 않습니다. 오프셋을 계산하는 데 필요한 나노초 또는 그와 관련하여 예 2는 가장 작은 오버 헤드 비트를 추가합니다.

1

아니요, 제목이 내 질문에 연결되어 있지 않은 것 같습니다. C는 a 가정에서

0

a[i][j] 

주어진 예
*(*(a+i)+j) 

동등하다 어레이 i 및 발현 후 j 정수 배열이며

int a[ROW][COL]; 

다음 식에서 :

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

각 a [i] 자체가 배열에 대한 참조 인 경우에만 같을 수 있지만 (여기서는 하나의 메모리 블록 인 경우와 반대입니다.) –

0

실제로 a가 선언 된 방법에 따라 다릅니다. 당신이 지적으로 - - 인덱스에 곱셈이 필요

는 적어도 두 가지 가능성

int a[4][4]; 

4 * 4 *의를 sizeof (int)를 바이트를 할당하고

있다. 초기화시 - - 기타 단일 차원 배열 포인터의 단일 차원 배열 인

다른 옵션

int **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.