함수 호출 규약

Posted in Programming by

1. __cdecl

함수를 정의 할 때 컴파일러에의해 사용되며 함수의 이름 앞에 _(under bar)를 붙인다. 함수의 인자가 있는 경우 오른쪽에서 왼쪽으로 스택을 통해 전달되며, 함수가 수행되고 반환되면 호출한 함수가 인자를 스택에서 제거하는 키워드이다.

 

2. __stdcall

명시적으로 지정되어야 사용이되며 함수의 이름 앞에 _를 붙이고 끝에 @기호와 인자의 바이트수(10진수)를 붙인다. 마찬가지로 왼쪽에서 오른쪽으로 인자가 스택을 통해 전달되며, 함수가 수행되고 반환되기 전에 함수 내에서 인자를 스택에서 제거하는 키워드이다.

일반적인 어플리케이션에서는 사용되지 않으며 특별한 경우에 사용되는데 C가 아닌 다른 언어를 위해 이것을 사용하며, 쓰레드나 운영체제가 호출하는 어플리케이션 함수에서 이를 사용한다.

 

3. __fastcall

명시적으로 지정하여 사용하며 함수의 이름 앞과 뒤에 @기호가 삽입되고 끝에는 인자의 바이트수(10진수)가 붙는다. 차이점은 32비트 범위 내의 두 인자에 대해서는 레지스터를 통해 전달하고, 32비트 범위를 넘어서거나 두 개를 넘는 인자는 스택을 통해 전달한다. 따라서 반복적으로 자주 호출되는 함수에 사용하면 실행 속도를 증가 시킬 수 있다.