[[프로그래밍_NOTE]]/C , C++

메모리 사상 함수 , 행우선 저장

갑빠돌격기 2009. 3. 8. 20:57

참고 : 새표준 C , C99 (김명호 저)

예시) int a[5] , b[3][5] , c[2][3][5]

컴파일러는 문장에서 a[i]와 같은 배열 표현이 나오면
이 a[i]를 a[0]으로보터 i번째 원소라는 것을 나타내는 포인터 수식으로 바꾼다.

즉 a[i]는
              *(&a[0] + i) 로 변환이 된다.

이차원 배열 b도 마찬가지이다. 문장에서 b[i][j]와 같은 배열 표현이 나오면 컴파일러는 이것이 b[0][0]으로부터 몇 번째 원소라는 것을 나타내는 포인터 수식으로 바꾼다. 어떻게 바뀌는지 살펴보자.

b배열을 그림으로 나타내면 다음과 같다.

사용자 삽입 이미지

다차원 배열도 메모리에 저장될 때에는 1차원으로 저장된다.

다차원 배열을 1차원에 저장하는 방법에는 두 가지가 있다.
첫 번째는 하위 차원 원소를 먼저(행우선) 저장하는 방식이고,
두 번째는 상위 차원 원소를 먼저(열우선)저장하는 방식이다.
(C에서는 행우선 방식을 사용한다.)

즉 C에서는 b배열이 저장될때
b[0][0] , b[0][1] ..... b[0][4] 이 저장되고 난후에
b[1][0] , b[1][1] ..... b[1][4]
b[2][0] , b[2][1] ..... b[2][4] 의 형태로 저장된다.

...(중략)

이렇게 배열 표현에서 포인터 수직으로 바꾸는 방법을
메모리 사상 함수 ( Memory mapping function)라고 한다.
배열 표현은 모두 포인터 수식으로 변환되는 데 이때 메모리 사상 함수를 사용하게 된다.

여기서 반드시 기억해야 하는 것은 배열 표현을 사용하여 배열의 원소를 참조하면 , 그 원소의 실제 주소를 찾기 위해 내부적으로 추가적인 곱하기와 더하기 연산이 필요하다는 것이다.
추가적인 연산의 수는 차원이 늘어날수록 더 많아진다. 추가적인 연산이 필요하다는 의미는 실행시간이 길어진다는 의미이다. 따라서 배열을 사용하면 편리하지만 실행시간이 늘어난다는 단점이 있음을 명심해야 한다.