---
# System prepended metadata

title: 함수호출규약

---

# 함수호출규약
**함수 호출 규약이란 호출자와 피호출자 간에 '함수를 호출할 때 전달되는 인자의 순서나 사용이 끝나고 나서의 스택 정리 등'에 대한 약속이라고 할 수 있다.**
1. _cdecl 방식
__cdecl 방식은 C/C++ 함수에서 기본적으로 사용되는 호출 규약이며, 호출자가 스택을 정리한다.
인자는 오른쪽에서 왼쪽으로 전달되어 호출자가 전달되는 인자 수를 알고 있기 때문에 가변 인자 함수를 만들 수 있다.
```cpp
int sum(int a, int b)
{ 
    return a + b; 
}
```
![](https://i.imgur.com/BzepQMS.png)

2. __stdcall 방식
__stdcall 방식은 Win32 API에서 사용되며, 피호출자가 스택을 정리합니다. 그리고 인자는 __cdecl 방식과 마찬가지로 오른쪽에서 왼쪽으로 전달되며 Win32 API에서는 가변 인수 함수가 없기 때문에, 매개변수의 개수가 고정적이다. 
```cpp
int __stdcall sum(int a, int b)
{
	return a + b;
}
```
![](https://i.imgur.com/hgATVWe.png)

3. __fastcall
__fastcall 방식에선 스택이 아닌 가까운 레지스터를 사용함으로써 호출 속도가 빠르며 피호출자가 스택을 정리하나 스택을 사용하지 않고 레지스터를 이용하므로 정리할 내용이 없어 따로 정리를 하지 않는다.
```cpp
int __fastcall sum(int a, int b)
{
	return a + b;
}
```
![](https://i.imgur.com/CwyRCV3.png)

