C++/콜링 컨벤션 차이

Win32의 콜링 컨벤션(Calling Conventions;호출 규약) #

스택을 이용하여 인자(argument)를 전달할 때 스택에 인자를 어떤 순서로 넣을 것이며 전달된 인자를 어느 곳에서 해제할 것인가를 결정하는 규약.

이 문서에서 가장 중요한 부분: __stdcall과 __cdecl의 차이점

__stdcall (standard call) #

함수 내부에서 스택을 정리한다. 함수 내부에서 인자를 바로 ret 하면서 정리하기 때문에 stdcall이 cdecl 보다 빠르고 바이너리 사이즈가 좀 더 작다. cdecl은 ret 후 인자를 정리하는 별도의 코드가 필요하다.
함수 독립성이 뛰어나므로 DLL을 만들 때는 반드시 stdcall로 선언해야 한다.
함수 이름 앞에 _가 붙으며 뒤에 @가 붙은 후 인수 목록의 바이트 수가 붙는다.

__cdecl (C declaration) #

(유일하게 cdecl만) 함수를 호출한 쪽에서 스택을 정리한다. 인자를 정리하려면 인자가 몇 개인지 알아야 하는데 따라서 인자가 불분명한 가변인자는 cdecl에서만 지원한다.
C와 가변인자를 사용하는 C++ 함수의 기본 호출 규약. 함수 이름 앞에 _가 붙는다.

기본 호출 규약에 대한 VC++ 컴파일러 옵션 - /Gz (stdcall), /Gr (fastcall), /Gd (cdecl)

기타 콜링 컨벤션

__fastcall #

처음 두 개까지의 DWORD 인자는 스택을 사용하지 않고 ECX와 EDX 레지스터를 사용한다. 이름 장식은 함수 이름 앞에 @가 붙으며 나머지는 stdcall과 같다.
인텔 CPU에서만 적용되고 볼랜드 컴파일러의 기본 호출 규약이다.

thiscall #

가변인자를 사용하지 않는 C++의 기본 호출 규약. ECX 레지스터에 this 포인터를 넣는다. 컴파일 시 가변인자인 경우 cdecl로 변경된다.
기본적으로 C++ 멤버 함수는 thiscall을 사용한다.

naked #

이름 장식을 하지 않는 것을 빼면 cdecl과 같다. VxDs에서만 사용한다.


참고



이 글에는 0 개의 댓글이 있습니다.