반응형
01. 정적 메모리 할당이란?
- 컴파일러가 소스코드를 기계어로 번역하는 시점에 변수에 크기에 맞게 메모리를 할당하는 것
- 프로그램이 실행될 때 메모리의 위치가 결정된다.
- 프로그램 실행 중에 할당된 메모리의 크기는 변경이 불가하다
02. 변수가 메모리에 유지되는 시간
(1) 전역변수
- 프로그램이 시작해서 종료할 때까지 유지
- 프로그램 실행 중에 전역 변수를 추가 혹은 삭제 불가
- 프로세스의 데이터 세그먼트에 저장됨
(2) 지역변수
- 함수가 호출될 때 메모리에 할당되었다가 함수가 끝나면 사라짐
- 프로세스의 스택 세그먼트에 저장됨
03. 정적으로 할당된 메모리를 관리하는 법
- 지역 변수를 사용하려면 그 변수의 현재 주소를 알아야한다.
- 각 지역 변수의 현재 주소를 기억하려면 지역변수의 개수만큼 메모리가 더 필요하다.
- 같은 함수에 선언한 지역 변수들을 하나의 메모리 그룹으로 관리 가능
- 지역 변수를 시작 위치(start) 포인터와 끝 위치(END) 포인터를 사용하여 관리 가능
- END 포인터가 필요한 이유는 뭘까? - 다음에 호출될 함수의 메모리 시작 위치를 결정
- https://www.youtube.com/watch?v=5_p2WxmHuyM&list=PLiZvlxkcLhakQwbPjkyfuHFy1IVG-VXrP&index=22&ab_channel=%EA%B9%80%EC%84%B1%EC%97%BD
04. 스택에 대하여
- 스택(Stack)은 자료구조의 한 종류
- 두 개의 포인터로 많은 양의 데이터를 효과적으로 관리하는 이론
- 베이스 포인터(Base Pointer BP)를 기준으로 데이터를 추가할 때마다 순서대로 데이터를 쌓아 올림
- 스택 포인터(Stack Pointer SP)로 새로운 데이터가 추가될 위치를 가리킴
자료구조(이론) | 컴퓨터 시스템(실제) | |
PUSH | 스택 포인터 주소 증가 | 스택 포인터 주소 감소 |
POP | 스택 포인터 주소 감소 | 스택 포인터 주소 증가 |
05. 컴파일러가 지역 변수를 저장할 메모리 공간을 확보하는 방법
- int a, b,c
- 어셈블리어 (sub SP, 12) :SP 값을 12만큼 줄여 공간확보
- 어셈블리어 (add SP, 12) :SP 값을 12만큼 증가시켜 공간 제거
06. 컴파일러가 스택에 할당된 지역 변수를 사용하는 원리
- C언어 컴파일러는 지역 변수가 선언된 순서대로 메모리를 할당
- 최근에 저장된 스택 포인터(SP) 바로 아래의 데이터부터 차례대로 꺼낼 수 있다.
07. Main 함수가 다른 함수를 호출 할때는?
- instruction point : 명령어들이 가지고 있는 번호
- main함수에서 다른 함수를 호출 할 때, 해당 함수가 호출 되고 나서 되돌아오기 위해 스택에 main 함수 ip를 저장해 둔다.
- 그리고 main함수의 BP를 메모리에 저장하여 원점으로 바꿔준다.
반응형
'programming language > C' 카테고리의 다른 글
[C언어]🕜🕝비트 연산자🕜🕝 (0) | 2022.10.31 |
---|
댓글