__fastcall
Microsoft 전용
__fastcall 호출 규칙은 가능하면 함수의 인수가 레지스터로 전달되도록 지정합니다. 이 호출 규칙은 x86 아키텍처에만 적용됩니다. 다음 목록에서는 이러한 호출 규칙의 구현을 보여 줍니다.
요소 |
구현 |
---|---|
인수 전달 순서 |
왼쪽에서 오른쪽으로 인수 목록에서 발견된 처음 두 개의 DWORD 이하 인수는 ECX 및 EDX 레지스터로 전달되고, 다른 모든 인수는 오른쪽에서 왼쪽으로 스택에 전달됩니다. |
스택 유지 관리 책임 |
호출된 함수가 스택에서 인수를 꺼냅니다. |
이름 데코레이션 규칙 |
이름 앞에 at 기호(@)가 붙습니다. 이름 뒤에는 at 기호 다음에 매개 변수 목록의 바이트 수(10진수)가 붙습니다. |
대/소문자 변환 규칙 |
대/소문자 변환은 수행되지 않습니다. |
참고
이후 컴파일러 버전은 다른 레지스터를 사용하여 매개 변수를 저장할 수도 있습니다.
/Gr 컴파일러 옵션을 사용하면 함수가 충돌하는 특성을 사용하여 선언되거나 함수 이름이 main인 경우를 제외하고 모듈의 각 함수가 __fastcall로 컴파일됩니다.
__fastcall 키워드는 ARM 및 x64 아키텍처를 대상으로 하는 컴파일러에서 허용되고 무시됩니다. x64 칩에서는 규칙에 따라 처음 네 개의 인수가 가능하면 레지스터로 전달되고 추가 인수는 스택에 전달됩니다. 자세한 내용은 x64 호출 규칙 개요을 참조하십시오. ARM 칩의 경우 최대 4개의 정수 인수와 8개의 부동 소수점 인수가 레지스터로 전달될 수 있으며 추가 인수는 스택에 전달됩니다.
비정적 클래스 함수의 경우 함수가 아웃오브 라인으로 정의되면 호출 규칙 한정자를 아웃오브 라인 정의에서 지정하지 않아도 됩니다. 즉, 클래스 비정적 멤버 메서드의 경우 선언하는 동안 지정된 호출 규칙이 정의 시 가정됩니다. 다음의 클래스 정의를 가정해 봅니다.
struct CMyClass {
void __fastcall mymethod();
};
다음 코드는
void CMyClass::mymethod() { return; }
다음 코드 조각과 일치합니다.
void __fastcall CMyClass::mymethod() { return; }
예제
다음 예제에서 DeleteAggrWrapper 함수에는 레지스터로 인수가 전달됩니다.
// Example of the __fastcall keyword
#define FASTCALL __fastcall
void FASTCALL DeleteAggrWrapper(void* pWrapper);
// Example of the __ fastcall keyword on function pointer
typedef BOOL (__fastcall *funcname_ptr)(void * arg1, const char * arg2, DWORD flags, ...);