> 백엔드 개발 > C++ > 다양한 호출 규칙이 C/C의 함수 호출에 어떤 영향을 미칩니까?

다양한 호출 규칙이 C/C의 함수 호출에 어떤 영향을 미칩니까?

Mary-Kate Olsen
풀어 주다: 2024-11-24 13:25:17
원래의
493명이 탐색했습니다.

How Do Different Calling Conventions Impact Function Calls in C/C  ?

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 중국어 웹사이트의 기타 관련 기사를 참조하세요!

원천:php.cn
본 웹사이트의 성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.
저자별 최신 기사
인기 튜토리얼
더>
최신 다운로드
더>
웹 효과
웹사이트 소스 코드
웹사이트 자료
프론트엔드 템플릿