hyelie
hyelie
Hyeil Jeong
       
글쓰기    관리    수식입력
  • 전체보기 (495)
    • PS (283)
      • Algorithm (28)
      • PS Log (244)
      • Contest (6)
      • Tips (5)
    • Development (52)
      • Java (14)
      • Spring (23)
      • SQL (2)
      • Node.js (2)
      • Socket.io (3)
      • Study (4)
      • Utils (4)
    • DevOps (36)
      • Git (5)
      • Docker (4)
      • Kubernetes (2)
      • GCP (3)
      • Environment Set Up (8)
      • Tutorial (12)
      • Figma (2)
    • CS (74)
      • OOP (7)
      • OS (24)
      • DB (2)
      • Network (24)
      • Architecture (0)
      • Security (2)
      • Software Design (0)
      • Parallel Computing (15)
    • Project (15)
      • Project N2T (5)
      • Project ASG (0)
      • Project Meerkat (1)
      • Model Checking (7)
      • Ideas (2)
    • 내가 하고싶은 것! (34)
      • Plan (16)
      • Software Maestro (10)
      • 취준 (8)
hELLO · Designed By 정상우.
hyelie

hyelie

[컴퓨터 SW] Array/Structure/Union의 할당과 접근
CS/OS

[컴퓨터 SW] Array/Structure/Union의 할당과 접근

이 글은 포스텍 김종 교수님의 컴퓨터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이 위와 같이 선언되었을 때, 어떻게 저장될까?

 

이렇게 저장되지 않을까?
NO. alignment가 적용되어 이렇게 저장된다.

 두 그림 중 아래의 것처럼 저장된다. 
  • 선언된 순서대로 메모리에 올라간다.
  • 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
    hyelie
    hyelie

    티스토리툴바