함수 호출 규칙
1. __cdecl
C 또는 C++ 프로그램에서 파라미터 전달시 디폴트로 사용
파라미터 전달은 오른쪽에서 왼쪽 방향으로 스택에 저장
파라미터 해제는 프로시저를 호출한 것이 책임짐(스택정리)
2. __stdcall
Windows API 프로시저에서 아용
파라미터 전달은 _cdecl과 동일
파라미터 해제는 프로시저 복귀 전에 이루어짐
장점
- 함수 독립성이 뛰어남
- 프로시저를 부르기 전에 스택에 파라미터를 쌍아놓고 그 프로시저를 부르기만 하면 그 함수가 리턴된 후에는 그 프로시저의 스택 포인터가 이전 상태로 복원되었으므로 복귀된 후에 호출한 프로시저에 대하여 신경쓸 필요가 없음
- _cdecl 방식의 콜링컨벤션에 비해 코드 크리가 줄어든다.
- 스택을 해제하는 코드가 호출한 프로시저 안에 있으므로 이 프로시저가 여러 곳에서 호출된다 할지라도 스택 해제하는 코드는 프로시저 내에 하나만 존재함
3. __fastcall
처음 두개까지의 파라미터는 스택을 사용하지 않고, ecx와 edx 레지스터를 사용함
그 이상의 파라미터에 대해서만 오른쪽에서 왼쪽으로 스택에 저장
스택 제거는 _stdcall과 동일
예1)
void foo(int a)
{
}
void __stdcall goo(int b)
{
}
int main()
{
void (*p)(int) = foo;
void(__stdcall * p)(int) = goo;
}
예2)
class Test
{
public
void foo(int);
};
int main()
{
test t;
void (test::*p)(int) = &(test::foo);
(tt.*p)(10);
}