함수 호출 규약이란 함수를 호출 할 때 *파라미터를 어떤식으로 저장하는가에 대한 일종의 약속입니다.

함수를 호출하는 방식에 대해 인수는 어떻게 전달하며 리턴값은 어떻게 반환할 것이고 인수 전달을 위해 메모리는 누가 정리할 것인지를 규정한다.


*파라미터(Parameter)  :  매개변수라는 뜻으로 함수를 정의 할 때 외부로 받아들이는 임의의 값을 의미한다.



Ⅰ. 스택 (Stack)


호출 규약에 대해 알기 위해서는 스택에 대해 알아야 한다.

스택은 시스템이 사용하는 메모리 공간이며 CPU가 임시적인 정보를 저장할 필요가 있을 때 이 영역을 사용한다.

 


 

일반적인 운영체제의 메모리 구조는 위의 그림과 같다.

앞부분에는 프로그램의 코드, 이어서 데이터 영역, 자유영역인 힙이 있다.

스택은 메모리의 가장 뒷부분에 있는데 힙과 스택이 만나게 되면 메모리가 부족한 상태가 된다.




 

Ⅱ. 스택 프레임 (Stack Frame)



함수가 호출될 때 스택에는 함수로 전달되는 인자, 실행을 마치고 돌아올 복귀 번지, 

지역 변수등의 정보들이 저장된다. 이때 스택에 저장되는 함수의 호출 정보를 스택 프레임이라고 한다.

또한 함수 실행중에도 필요할 경우 임시적인 정보 저장을 위래 스택을 사용하되 이때 PUSH 함수와 POP 함수는 

일치하므로 함수가 리턴하면 정확하게 호출 전의 상태로 돌아가 항상성을 유지한다.

즉, 함수가 호출될 때 인수와 복귀 번지, 지역변수 영역등을 가진 

스택 프레임이 생성되고 리턴된 후 정확하게 복구하도록 되어있다.


⚀ 함수 호출에 대한 주요 내용


1. 인수도 함수 호출 중에만 유지되는 일종의 지역변수이다. 인수의 초기화 시점은 함수가 호출될 때이다.


2. 지역변수를 많이 선언하는 것과 함수의 실행속도와는 직접적인 상관이 없다.


3. 지역변수를 많이 쓴다고 해서 프로그램이 커지는 것도 아니다.


4. 지역변수를 위해 ESP를 위로 올려 공간만 만들 뿐이므로 별도의 초기식이 없으면 

   지역변수는 초기화 되지 않는다. 이때 원래 공간에 들어있던 값이 바로 쓰레기 값이다. 

   지역변수를 초기화화면 이때는 초기화하는 시간만큼 느려지고 필요한 코드만큼 프로그램의 크기도 늘어난다.


5. 함수를 호출할 때마다 스택프레임이 생성되었다가 사라지는 복잡한 과정을 거치므로

   함수 호출에는 오버헤더가 있다.

   

(?) 오버헤드는 어떤 처리를 하기 위해 들어가는 간접적인 처리 시간 , 

    메모리등을 말한다. 여기서 오버헤더는 오버헤드 인가?




Ⅲ. 호출 규약



기본적인 C/C++ 언어의 호출 규약인  _cdecl은 인수를 뒤쪽부터 

순서대로 전달하며 인수 전달에 사용한 스택 영역은 *호출원이 정리한다. 

이런 호출 규약이 변경되면 스택 프레임의 모양과 관리 방법도 달라진다

아래는 각 호출 규약들에 대해 정리한 것이다.


* 호출원 : 함수를 호출한 곳