본문 바로가기

고급C,C++

[고급C언어] 함수호출규칙

함수 호출 규칙
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);

}