일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | 6 | 7 |
8 | 9 | 10 | 11 | 12 | 13 | 14 |
15 | 16 | 17 | 18 | 19 | 20 | 21 |
22 | 23 | 24 | 25 | 26 | 27 | 28 |
29 | 30 | 31 |
- tiles.xml
- 알고리즘
- Cookie
- 배포
- phaser
- node.js
- 도커
- RDS
- jQuery
- 웹소켓
- express
- CSS
- JSP
- Spring
- HTML
- websocket
- 블록체인
- autowired
- AWS
- EC2
- model1
- SQL
- Servlet
- Ajax
- JavaScript
- 웹게임
- 비트코인
- 암호화
- docker
- PL/SQL
- Today
- Total
記錄
C) 메모리 구조 - 스택(Stack) - (2) 본문
<메모리 구조 - 스택(Stack) - (2)>
이 포스팅은 제가 만든 것이 아니고 유투브의 강의를 듣고 복습을 위해 정리한 것입니다. 유투브 강의의 출처는 맨 아래에 밝혀둡니다.
int sum = 0으로 전역변수 sum이 초기화와 선언이 동시에 되면서 Stack Segment가 아닌 Data Segment 에 sum으로 공간 할당이 이뤄지고 값이 0으로 들어간 것을 유념한다!!
여기서 나는 전역변수와 지역변수가 메모리에 저장되는 공간과 시기가 다르다는 것을 확인할 수 있다. 지역변수와 함수 parameter는 런타임시에 메모리에 push되고 함수의 종료와 함께 pop되어버리는 것에 반해 Data Segment에 push되는 전역변수는 컴파일 시에 push되어 계속 메모리에 상주하면서 값이 갱신되는 것이다.
코딩할 때에 이미 이러한 내부 작용을 이해한 채로 코딩하는 것과 그냥 '이건 이런거다' 하고 코딩 하는 것은 10년 뒤 큰 차이가 있다(라고 포프tv에서 보았음)
main이 실행되고 a, b, sum이 순서대로 공간이 할당되었다. 주목할 부분은 sum이다. 전역변수로 sum이 있지만 int로 다시 sum의 공간을 할당하였으므로 스택에 sum의 이름으로 공간이 할당된 것을 확인할 수 있다.
지난 강의에서 공부했듯이 함수의 parameter는 뒤에서부터 push되는 것을 확인할 수 있다
sum 값에 8이 들어갔다. add함수에서 sum = a+b를 만났을때 sum을 찾게 되는데 먼저 우선순위가 있는 지역변수로서 sum으로 할당된 공간이 있는지를 찾고 그것이 없으면 전역변수로 sum이 할당되었는지를 찾게 된다. add 함수에서는 main함수에서 int로 sum 변수가 할당된 것과는 달리 지역변수로서의 sum이 존재하지 않아서 전역변수로 가서 찾아 그 공간에 a + b의 결과인 8을 넣은 것이다
sum = add(a, b)가 종료되면서 push되었던 값들이 pop되어 없어져버린 모습이다. 여기서 확실히 유념해야 할 것은 전역변수인 8은 pop되지 않았다는 것이다. 왜냐하면 push와 pop은 지역변수나 함수의 parameter를 저장하는 Stack Segment에서 일어나는 것이고 전역변수로 선언된 sum은 Data Segment에 적재되어 있기 때문에 pop의 영향이 없다
그리고 return으로 sum을 돌려주고 있어서 곧 main 함수의 sum에 8이 들어가게 된다. 즉, add 함수에서 정의하고 있는 sum에도 8이 들어감과 동시에 sum값을 return함으로써 main 함수의 sum에도 8이 들어가게 된다
main 함수의 sum에 8이 들어간 것을 확인할 수 있다. 그리고 함수의 parameter에 대한 push는 뒤에서 부터 된다고 하였는데 여기서도 마찬가지로 b에 5가 first in 된 것을 확인할 수 있다
main 함수의 sum = add(4, 5)의 결과로 sum에 9가 할당되었고 종료와 동시에 Data Segment에 저장된 sum값 9를 제외한 나머지 Stack 영역의 것들은 pop 되었다.
곧 sum 값이 return되면서 main 함수의 sum에도 9가 할당 될 것이다.
main 함수가 종료되면서 Stack Segment 의 모든 것이 pop되고
Data Segment의 값만 남은 상태
cf. 지역변수와 전역변수의 유효범위의 차이를 메모리의 저장영역으로 설명해보자
이번 포스팅을 내가 제대로 공부 했다면 지역변수와 전역변수의 유효범위가 다른 이유를 메모리의 저장영역의 차이로 설명할 수 있어야 한다. 지역변수는 런타임시에 Stack Segment에서 1회성으로 push 되고 종료시 pop이 되어 사라지기 때문에 다른 함수에서 사용할 수 없는 것이다. 전역변수는 컴파일시에 이미 Data Segment에 공간이 할당되고 초기화 되기 때문에 pop이 될 일이 없어서 얼마든지 다른 함수에서 불러다 사용할 수 있다.
출처 : https://www.youtube.com/watch?v=CuPt4wZ8AbE
'Computer language > C' 카테고리의 다른 글
C) 배열과 포인터 (0) | 2017.12.21 |
---|---|
C) 배열 (0) | 2017.12.21 |
C) 포인터 (0) | 2017.12.21 |
C) 메모리 주소와 Align (0) | 2017.12.20 |
C) 메모리 구조 - 스택(Stack) - (1) (0) | 2017.12.19 |