프로그래밍 언어론 3-2-2강. 메모리할당 - 스택기반 할당(Stack-based allocation)

[프로그래밍 언어론]

2019. 10. 26. 14:27

과거에는 정적할당의 개념밖에 없어서 재귀 사용일 불가능했다. (변수등의 위치가 지정된 상태)

 

 

[스택기반 할당]

: 재귀(Recursion) 사용 가능

: Subroutine 들이 스택에 그들만의 frame 형태로 저장

일반적인 스택내 frame들의 구성

 

 

 

[프레임의 구성]

  • Arguments to called routines : 호출된 subroutine에 들어온 인자값​들
  • Temporaries : 복잡한 계산중 나오는 임시 값들
  • Local variables : 지역변수
  • Miscellaneous bookkeeping : 서브 루틴의 반송 주소, 이 subroutine을 요청자의 스택 프레임에 대한 참조값들

     (bookkeeping information 통해 이전 프레임으로 복귀한다(재귀))

 

 

 

[스택의 유지]

: 이러한 스택은 시퀀스 호출을 통해 유지된다.

- 시퀀스 호출 : caller에 의해 실행되는 호출 직전(프롤로그)과 호출 이후(에필로그)에 실행되는 코드

  (프롤로그와 에필로그는 {, } 형태로 고급수준에서 보이고, 어셈블리어에서 해당 문자열에 해당되는 명령이 존재)

 

 

 

[스택내 frame의 위치]

: 컴파일 시점에서 스택내에 subroutine(frame)들 위치를 예측할 수 없다.

: 하지만, 각 프레임내부의 객체(지역변수등)들의 위치offset간격으로 정적 결정되기때문에 예측할 수 있다.

 

 

 

[지역변수의 할당]

: 지역변수들은 재귀가 아니여도 스택기반 할당된다.

=> 정적할당되면 컴파일 시점에 지역변수등들이 지정되는데 쓸데없이 공간 차지하게된다.

=> 모든 subroutine들 동시실행되는거아니니 스택기반 할당해서 생성, 삭제해서 이용

=> 이 두가지 이유로, 스택기반할당하면 필요할때만 스택에 할당되므로 메모리 공간 효율성에 이득이다.