__thiscall

Microsoft 전용 __thiscall 호출 규칙은 X86 아키텍처의 c + + 클래스 멤버 함수에 사용 됩니다.The Microsoft-specific __thiscall calling convention is used on C++ class member functions on the x86 architecture. 변수 인수 (함수)를 사용 하지 않는 멤버 함수에서 사용 하는 기본 호출 규칙 vararg 입니다.It's the default calling convention used by member functions that don't use variable arguments (vararg functions).

에서 __thiscall 호출 수신자는 함수에 대해 불가능 한 스택을 정리 합니다 vararg .Under __thiscall , the callee cleans the stack, which is impossible for vararg functions. 인수는 오른쪽에서 왼쪽으로 스택에 푸시됩니다.Arguments are pushed on the stack from right to left. this 포인터는 스택이 아니라 레지스터 ECX를 통해 전달 됩니다.The this pointer is passed via register ECX, and not on the stack.

ARM, ARM64 및 x64 컴퓨터에 __thiscall 는 컴파일러에서 허용 되 고 무시 됩니다.On ARM, ARM64, and x64 machines, __thiscall is accepted and ignored by the compiler. 이는 기본적으로 레지스터 기반 호출 규칙을 사용 하기 때문입니다.That's because they use a register-based calling convention by default.

를 사용 하는 한 가지 이유 __thiscall 는 멤버 함수가 기본적으로를 사용 하는 클래스입니다 __clrcall .One reason to use __thiscall is in classes whose member functions use __clrcall by default. 이 경우를 사용 __thiscall 하 여 네이티브 코드에서 개별 멤버 함수를 호출할 수 있게 할 수 있습니다.In that case, you can use __thiscall to make individual member functions callable from native code.

를 사용 하 여 컴파일하는 경우에 /clr:pure 는 별도로 __clrcall 지정 하지 않는 한 모든 함수와 함수 포인터가 됩니다.When compiling with /clr:pure, all functions and function pointers are __clrcall unless specified otherwise. /clr:pure/clr:safe 컴파일러 옵션은 visual studio 2015에서 더 이상 사용 되지 않으며 visual studio 2017에서는 지원 되지 않습니다.The /clr:pure and /clr:safe compiler options are deprecated in Visual Studio 2015 and unsupported in Visual Studio 2017.

vararg 멤버 함수는 __cdecl 호출 규칙을 사용 합니다.vararg member functions use the __cdecl calling convention. 모든 함수 인수는 스택에 푸시되 고 this 포인터는 마지막 스택에 배치 됩니다.All function arguments are pushed on the stack, with the this pointer placed on the stack last.

이 호출 규칙은 c + +에만 적용 되기 때문에 C 이름 데코레이션 체계가 없습니다.Because this calling convention applies only to C++, it doesn't have a C name decoration scheme.

비정적 클래스 멤버 함수를 아웃오브 라인으로 정의 하는 경우 선언에만 호출 규칙 한정자를 지정 합니다.When you define a non-static class member function out-of-line, specify the calling convention modifier only in the declaration. 아웃오브 라인 정의에서 다시 지정할 필요가 없습니다.You don't have to specify it again on the out-of-line definition. 컴파일러는 정의 지점에서 선언 중에 지정 된 호출 규칙을 사용 합니다.The compiler uses the calling convention specified during declaration at the point of definition.

참조See also

인수 전달 및 명명 규칙Argument passing and naming conventions