2010-02-23 4 views
7

무엇입니까? 그리고 개발자로서 이들의 영향을 어떻게 받습니까?사용자 지정 호출 규칙이란 무엇입니까?

관련 : 함수를 호출 할 때
What are the different calling conventions in C/C++ and what do each mean?

+0

어떤 맥락에서? Win32? Win64? 리눅스? 솔라리스? 인텔? PowerPC? –

+2

duplicate : http://stackoverflow.com/questions/949862/what-are-the-different-calling-conventions-in-cc-and-what-do-each-mean – Earlz

+11

나는 이것을 닫으려는 사람들이 (a) ** 사용자 정의 호출 규칙이 ** 무엇인지 이해하지 못하거나 ** (b) ** 정확하게 질문을 읽지 않았습니다 **. 그것들은 중복 된 질문에 의해 다루어지지 않는 특별한 최적화입니다. 중복 된 정보를 다시 열고 삭제하는 투표. –

답변

9

호출 규칙은 다른 기능을 호출하는 방법을 설명합니다. 이를 위해서는 매개 변수와 상태를 다른 함수에 전달해야 컨트롤을 올바르게 실행하고 반환 할 수 있습니다. 이것이 수행되는 방식은 표준화되고 지정되어야한다. 그래서 컴파일러는 호출되고있는 원격 함수가 소비 할 매개 변수를 정렬하는 방법을 알고있다. 이 몇 가지 표준 호출 규칙이 있지만, 가장 일반적인 fastcall, stdcallcdecl이다.보통

, 용어 정의 규칙이 잘못된 약간이며, 두 가지 중 하나를 의미 호출 :

  • 비 표준 확산에없는 호출 규칙 또는 1 사용 (예 : 처음부터 아키텍처를 만드는 경우).

  • 성능을 향상시키기 위해 원샷 호출 규칙을 사용하는 컴파일러/링커가 수행 할 수있는 특별한 최적화입니다.

후자의 경우 스택에 푸시 될 일부 값이 대신 레지스터에 저장됩니다. 컴파일러는 코드 내에서 매개 변수가 사용되는 방식에 따라이 결정을 시도합니다. 예를 들어, 매개 변수가 루프 색인의 최대 값으로 사용될 경우, 각 반복에서 색인이 최대 반복 횟수와 비교되어 계속되어야 하는지를 확인하는 것이 좋습니다. 레지스터.

최적화를 수행하면 일반적으로 코드 크기가 줄어들고 성능이 향상됩니다.

그리고 개발자로서 어떻게 영향을 받았습니까?

개발자 입장에서 보면 별 상관이 없습니다. 이는 자동으로 최적화 될 것입니다.

1

각 언어, 매개 변수는 스택에 대 레지스터 변수에 전달 될 일에 대해 규칙을 가지고 있으며, 값을 반환하는 방법 반환됩니다.

때로는 표준 컨벤션과 다른 컨벤션이 사용되며 이것을 맞춤 통화 협약이라고합니다.

다른 언어로 상호 운용 할 때 가장 일반적입니다. 예를 들어, C와 Pascal은 매개 변수를 전달하는 방법에 대해 다른 규약을 가지고 있습니다. C의 관점에서 파스칼 호출 규칙은 사용자 정의 호출 규칙이라고 할 수 있습니다.

+0

"pascal"은 사용자 정의 호출 규칙이 아니며 일반적인 명명 규칙입니다. 또한, 그것은 역사이지, 안 그래? 16 비트 일의 유물? – Steve314

+1

나는 이것이 C의 관점에서 볼 때 커스텀 콜링 컨벤션이라고 말했다. 또한, 그것은 개념을 설명하고, 확실히 downvote의 가치가없는 적절한 예입니다. –

0

로컬 변수를 참조하는 스택을 직접 조작하거나 인라인 어셈블리를 작성하는 경우가 아니면 영향을 미치지 않습니다. 또는 다른 호출 규칙과 연결된 라이브러리와의 인터페이스가있는 경우

설명 : 대부분의 컴파일러와 같은 함수 호출 인수는 특정 순서로 스택 등에 푸시되는 cdecl과 같은 표준 호출 규칙을 사용합니다.

+0

이것은 적절하지 않습니다. 그는 특별한 최적화 인 call custom convention에 대해서 물어 보았습니다. 특히 기존의 호출 규칙에 해당하지는 않았습니다. –

1

나는 당신이 정말로 신경 쓸 필요가 없다고 생각합니다.

일반적인 호출 규칙은 __stdcall 및 __fastcall과 같은 것입니다. 호출 서명이 스택 레이아웃으로 변환되는 방식, 호출자 또는 호출 수신자가 레지스터 저장 및 복원을 담당하는 방식을 결정합니다. 예를 들어 __fastcall은 __stdcall이 스택을 더 많이 사용하는 레지스터를 더 많이 사용해야합니다.

사용자 지정 호출 규칙은 특정 기능과 사용 방법에 맞게 특별히 최적화되어 있습니다. 특정 모듈에 국한된 기능의 경우에만 IIRC가 발생합니다. 컴파일러가 어떻게 사용되는지, 외부 호출자가 규칙을 지정할 필요가 없다는 것을 어떻게 알 수 있는지에 대해서 컴파일러는 잘 알고 있습니다.

컴파일러는이를 바탕으로 적절한 경우 자동으로 코드를 사용하며 코드가 약간 더 빠르게 실행되거나 약간 더 적은 공간을 차지하지만 실제로 신경 쓸 필요는 없습니다.

관련 문제