C/C의 다양한 호출 규칙 이해
C/C는 각각 고유한 특징과 의미를 지닌 다양한 호출 규칙을 제공합니다. 함수 호출의 경우. 이러한 규칙은 인수가 함수에 전달되는 방법과 반환 값이 처리되는 방법을 결정합니다.
사용 가능한 호출 규칙
C/C에서 사용할 수 있는 기본 호출 규칙은 다음과 같습니다.
-
cdecl: 인수가 스택에 푸시됩니다. 오른쪽에서 왼쪽, 호출 수신자 저장 레지스터(EAX, ECX, EDX) 및 호출자 저장 레지스터(스택 포인터 및 나머지).
-
syscall: cdecl과 유사하지만 EAX, ECX 및 EDX는 보존되지 않습니다. 매개변수 목록 크기는 AL로 전달됩니다.
-
pascal: 인수는 스택에 왼쪽에서 오른쪽으로 푸시되며 호출 수신자는 스택 밸런싱을 담당합니다.
-
stdcall: 호출 수신자가 스택 정리를 담당하지만 매개변수가 스택에 푸시되는 파스칼의 변형입니다. 오른쪽에서 왼쪽으로. EAX, ECX 및 EDX는 함수 내에서 사용하도록 지정됩니다.
-
fastcall: 처음 두 인수를 ECX 및 EDX 레지스터에 전달하고 나머지 인수를 오른쪽에서 왼쪽으로 스택에 전달합니다. .
연장 통화 규칙
이러한 표준 규칙 외에도 특수한 변형이 있습니다:
-
Vectorcall: SIMD 레지스터를 사용하여 벡터 인수를 전달하고 전달에 대한 지원을 확장합니다. 동종 벡터 집계 값.
-
safecall: EAX에서 HResult로 다시 전달되는 예외와 스택에서 참조로 전달되는 결과를 사용하여 COM 오류 처리를 캡슐화합니다.
-
Microsoft X64 호출 규칙: 정수 및 부동 소수점 인수에 특정 레지스터를 사용합니다. 추가 인수가 스택에 푸시됩니다. 호출자는 스택에 "섀도우 공간"을 할당할 책임이 있습니다.
올바른 규칙 선택
적절한 호출 규칙은 특정 플랫폼, 컴파일러에 따라 다릅니다. 및 응용 프로그램 요구 사항. 호출 규칙을 선택할 때 매개변수 수, 레지스터 사용량, 성능 최적화 등의 요소를 고려하세요.
예를 들어 stdcall은 일반적으로 Windows API 함수를 호출하는 데 사용되는 반면 cdecl은 Unix 계열 환경에서 자주 사용됩니다. fastcall은 매개 변수가 거의 없는 함수에 대해 더 빠른 성능을 제공할 수 있습니다.
추가 리소스
- [Microsoft Docs: 호출 규칙](https://docs.microsoft. com/en-us/cpp/build/x64-calling-convention)
- [Wikipedia: Calling 규칙](https://en.wikipedia.org/wiki/Calling_convention)
위 내용은 다양한 호출 규칙이 C/C의 함수 호출에 어떤 영향을 미칩니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!