__fastcall
Microsoft 전용
호출 규칙은 __fastcall
가능한 경우 함수에 대한 인수를 레지스터에 전달하도록 지정합니다. 이 호출 규칙은 x86 아키텍처에만 적용됩니다. 다음 목록에서는 이러한 호출 규칙의 구현을 보여 줍니다.
요소 | 구현 |
---|---|
인수 전달 순서 | 왼쪽에서 오른쪽으로 인수 목록에 있는 처음 두 DWORD 개 또는 더 작은 인수는 ECX 및 EDX 레지스터에 전달됩니다. 다른 모든 인수는 오른쪽에서 왼쪽으로 스택에 전달됩니다. |
스택 유지 관리 책임 | 호출된 함수가 스택에서 인수를 꺼냅니다. |
이름 데코레이션 규칙 | 기호(@)에 이름 앞에 접두사로 지정됩니다. 매개 변수 목록의 바이트 수(10진수)가 뒤에 붙는 at 기호는 이름에 접미사가 붙습니다. |
대/소문자 변환 규칙 | 대/소문자 변환은 수행되지 않습니다. |
클래스, 구조체 및 공용 구조체 | 크기에 관계없이 "멀티바이트" 형식으로 처리되고 스택에 전달됩니다. |
열거형 및 열거형 클래스 | 레지스터에 의해 기본 형식이 전달되는 경우 레지스터에 의해 전달됩니다. 예를 들어 기본 형식이 int unsigned int 크기가 8, 16 또는 32비트인 경우입니다. |
참고 항목
이후 컴파일러 버전은 다른 레지스터를 사용하여 매개 변수를 저장할 수도 있습니다.
/Gr 컴파일러 옵션을 사용하면 함수가 충돌하는 특성을 사용하여 선언되거나 함수 이름이 선언되지 않는 한 모듈의 각 함수가 컴파일 __fastcall
됩니다main
.
__fastcall
이 키워드(keyword) ARM 및 x64 아키텍처를 대상으로 하는 컴파일러에서 허용되고 무시됩니다. x64 칩에서는 규칙에 따라 처음 4개의 인수가 가능한 경우 레지스터에 전달되고 스택에 추가 인수가 전달됩니다. 자세한 내용은 x64 호출 규칙을 참조 하세요. ARM 칩의 경우 최대 4개의 정수 인수와 8개의 부동 소수점 인수가 레지스터로 전달될 수 있으며 추가 인수는 스택에 전달됩니다.
비정적 클래스 함수의 경우 함수가 오프라인으로 정의된 경우 호출 규칙 한정자를 아웃 오브 라인 정의에 지정할 필요가 없습니다. 즉, 클래스 비정적 멤버 메서드의 경우 선언하는 동안 지정된 호출 규칙이 정의 시 가정됩니다. 다음의 클래스 정의를 가정해 봅니다.
struct CMyClass {
void __fastcall mymethod();
};
다음 코드는
void CMyClass::mymethod() { return; }
다음 코드 조각과 일치합니다.
void __fastcall CMyClass::mymethod() { return; }
이전 버전 _fastcall
과의 호환성을 위해 __fastcall
컴파일러 옵션 /Za(언어 확장 사용 안 함) 를 지정하지 않는 한 동의어입니다.
예시
다음 예제에서 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, ...);
Microsoft 전용 종료
참고 항목
피드백
https://aka.ms/ContentUserFeedback
출시 예정: 2024년 내내 콘텐츠에 대한 피드백 메커니즘으로 GitHub 문제를 단계적으로 폐지하고 이를 새로운 피드백 시스템으로 바꿀 예정입니다. 자세한 내용은 다음을 참조하세요.다음에 대한 사용자 의견 제출 및 보기