책/CSAPP

CSAPP 3.8

에린_1 2024. 1. 23. 22:13
728x90

CSAPP

3.8 배열의 할당과 접근

  • C에서 배열을 스칼라 데이터를 보다 큰 자료형으로 연계 시키는 수단이다. 한가지 특이한 점은 배열 원소들에 대한 포인터를 만들고 이들 포인터간에 연산을 할 수 있다는 점이다. 이것은 기계어에서 주소 계산으로 번역된다.

3.8.1 기본원리

  • 자료형 T와 정수형 상수 N
T A[N];
  • 시작하는 위치를 xA라고 표시했을 때, 이 선언은 두 가지 효과를 갖는다.
    1. 이것은 L*N 바이트의 연속적인 공간을 메모리에 할당하며, 여기서 L(바이트의 단위)은 자료형 T의 크기를 나타낸다.
    2. 새로운 식별자 A를 통해서 배열이 시작하는 위치의 포인터로 사용한다. 이 포인터의 값은 xA다.
  • 배열의 각 원소는 0에서 N-1 사이의 정수형 인덱스를 사용해서 접근 가능하다.
  • 배열의 원소 i는 xA + L*i에 저장된다.

3.8.2 포인터 연산

  • C는 포인터간에 연산을 허용하며, 계산된 값은 포인터가 참조하게 되는 자료형의 크기에 따라 그 값이 확대된다.
  • 단항 연산자(unary) ‘&’ ‘*’ 는 포인터 생성과 역참조를 수행한다 즉 어떤 객체를 나타내는 식 Expr에 대해 &Expr은 그 객체의 주소를 주는 포인터이다. 주소를 나타내는 식 AExpr에 대해 *AExpr은 그 주소에 위치한 값을 준다.
  • 배열참조 A[i]는 *(A+i)와 동일하다. 이것은 i번째 배열 원소의 주소를 계산해서 이 메모리 위치에 접근한다.
  • 동일한 자료구조내에서 두 포인터의 차를 계산 할 수 있다.

3.8.3 다중배열

  • 배열의 원소들은 메모리에 ‘행 우선(row major)’ 순서로 저장되는데, 이것은 A[0]으로 표시하는 모든 행 0의 원소들 다음에 행1(A[1])의 원소가 따라오는 방식으로 저장되는 것을 의미한다. 이러한 저장 순서는 우리가 사용한 다중선언의 결과이다.
  • 다차원 배열의 원소에 접근하기 위해서 컴파일러는 원하는 원소의 오프셋을 계산하는 코드를 생성하고, 배열의 시작을 기본 주소로, 오프셋을 인덱스(배율이 적용될 수도 있음)로 하는 MOV인스트럭션을 사용한다.

3.8.4 고정 크기의 배열

  • 최적화 수준이 -0일때 GCC가 수행하는 몇 가지 최적화
#define N 16

typedef int fix_matrix[N][N];
  • 프로그램이 배열의 차원이나 버퍼의 크기로 상수를 사용할 때, 매번 숫자를 사용하는것보다 #define 선언을 통해 변수명과 숫자를 연관지어 일괄적으로 변수명을 사용하는 것이 가장 좋다.
  1. A의 행 i의 연속된 원소들을 가리키는 Aptr로 이름 붙인 포인터를 생성한다.
  2. B의 열 k의 연속된 원소들을 가리키는 Bptr로 이름 붙인 포인터를 생성한다.
  3. 루프를 종료할 때 Bptr이 갖게 될 값과 동일한 Bend라고 이름 붙인 포인터를 생성한다.

3.8.5 가변 크기 배열

int A[expr1][expr2]
  • 가변 크기 배열의 C버전에서는 배열을 다음과 같이 지역변수나 함수의 인자로 선언할 수 있으며, 그러고 나서 배열의 차원은 선언 부분을 만날 때 수식 expr1과 expr2를 계산해서 결정된다.
int var_ele(long n, int A[n][n], long i, long j){
	return A[i][j];
}
  • 매개변수 n은 반드시 매개변수 A[n][n] 보다 먼저 나와야 한다. 그래서 함수가 매개변수를 만날 때 배열의 차원을 계산 할 수 있다.
  • 가변 크기 배열은 참조하기 위해서는 고정 크기 배열의 결과를 약간만 일반화 하면 된다. 동적 버전에서는 일련의 쉬프트와 더하기 대신에 i를 n으로 확대하기 위해서 곱셈을 사용해야 한다. 일부 프로세서에서는 곱셈이 상당한 성능저하를 가져오지만, 이 경우에는 어쩔 수 없다.
  • 루프내에서 가변 크기 배열을 참조할 때, 컴파일러는 접근하는 유형의 규칙성을 활용해서 종종 인덱스 계산을 최소화 할 수있다.
728x90

' > CSAPP' 카테고리의 다른 글

CSAPP 3.10.2  (0) 2024.01.26
CSAPP 3.9 - 3.10  (1) 2024.01.25
CSAPP 3.6.5 - 3.7  (1) 2024.01.22
CSAPP 3.5 - 3.6.4  (0) 2024.01.20
CSAPP 3.4  (0) 2024.01.20