이 글은 포스텍 김종 교수님의 컴퓨터SW시스템개론(CSED211) 강의를 기반으로 재구성한 것입니다.
이 글에서는 array와 structure가 선언되었을 때 메모리에 어떻게 저장하고 어떻게 접근하는지 알아본다.
Array
Allocation
TYPE ARRAY[LENGTH];
와 같이 선언된 경우, TYPE이 총 LENGTH개 있는 배열을 선언한 것이다. 이 때 메모리에는 LENGTH * sizeof(TYPE)만큼의 공간이 할당되며, ARRAY 안에 있는 값들은 연속되어 저장된다.
Access
값들이 연속되어 저장된다는 점을 이용해 array의 시작 주소를 이용해 array의 특정 element에 접근할 수 있다. 위 예시에서, ARRAY[i]의 주소값은 [시작 주소값] + sizeof(TYPE) * i이므로, 해당 주소에 ARRAY[i]값이 저장되어 있을 것이다.
1차원 배열
시작 주소를 x, S = sizeof(type), array[L]로 선언되었을 때 메모리 접근은 다음과 같다.
&array[i] = x + S * i
2차원 배열
시작 주소를 x, S = sizeof(type), array[R][C]로 선언되었을 때 메모리 접근은 다음과 같다.
&array[i] = x + S*C*i
&array[i][j] = x + S*C*i + S*j
3차원 배열
시작 주소를 x, S = sizeof(type), array[$R_1$][$R_2$][$R_3$]로 선언되었을 때 메모리 접근은 다음과 같다.
&array[i] = x + S*$R_2$*$R_3$*i
&array[i][j] = x + S*$R_2$*$R_3$*i + S*$R_3$*j
&array[i][j][k] = x + S*$R_2$*$R_3$*i + S*$R_3$*j + S*k
pointer array VS array pointer
C에서 괄호를 어디에 치냐에 따라 pointer의 array인지, array의 pointer인지가 달라진다.
- int *A1[3] : pointer array. 각각의 element가 pointer인 길이 3짜리 array이다.
- int (*A2)[3] : array pointer. length 3인 array를 가리키는 pointer이다.
몇 가지 문제
int A1[3];
int *A2[3];
int (*A3)[3];
위와 같이 A1, A2, A3가 있다고 하자. A1은 array, A2는 pointer array, A3는 array pointer이다. A1, *A1, **A1 / A2, *A2, **A2 / A3, *A3, **A3가 의미하는 것은 무엇일까?
의미하는 것 | size | |
A1 | length 3짜리 integer array | sizeof(int) * 3 = 12 |
*A1 | integer array의 한 element, 즉 int | sizeof(int) = 4 |
**A1 | X (접근 불가) | X (접근 불가) |
A2 | length 3짜리 pointer array | sizeof(address) * 3 = 24 |
*A2 | pointer array의 한 element, 즉 address | sizeof(address) = 8 |
**A2 | int pointer가 가지키는 것, 즉 int | sizeof(int) = 4 |
A3 | length 3짜리 array를 가리키는 pointer | sizeof(address) = 24 |
*A3 | length 3짜리 integer array | sizeof(int) * 3 = 12 |
**A3 | length 3짜리 integer array의 한 element, 즉 int | sizeof(int) = 4 |
Struct & Union
Allocation
struct S1{
char c;
int i[2];
double v;
} *p
어떤 structure S1이 위와 같이 선언되었을 때, 어떻게 저장될까?
- 선언된 순서대로 메모리에 올라간다.
- align은 structure component 중 제일 큰 alignment로 맞춰준다. 위 예시의 경우, double이 8byte이기 때문에 8byte로 align된다. 빈 공간은 비워둔다.
align size
align size | type |
1 | char |
2 | short |
4 | int, float |
8 | long, double, address |
Access
structure가 메모리에 저장될 때 [선언된 순서대로], [align되어 저장]되는 것을 알고 있기 때문에 array와 같은 방법으로 element에 접근한다.
바로 위에서 나온 structure의 경우를 예시로 들어보자. S1의 시작 주소를 x라고 하면
&S1.c = x
&S1.i[0] = x + 8
&S1.i[1] = x + 12
&S1.v = x + 16
'CS > OS' 카테고리의 다른 글
[컴퓨터 SW] Storage - RAM & Disk (0) | 2023.06.14 |
---|---|
[컴퓨터 SW] Buffer Overflow (0) | 2023.06.11 |
[컴퓨터 SW] Calling Convention (0) | 2023.06.10 |
[컴퓨터 SW] Byte Ordering (0) | 2023.06.08 |
[컴퓨터 SW] Bit를 이용한 컴퓨터의 정보 표현 (2) | 2023.06.07 |