문제

나는 보았 fastcall 표기법에 추가되기 전에 여러가지 기능을 제공합니다.왜 그것이 사용됩니까?

도움이 되었습니까?

해결책

는 표기 전에 기능입니다"라고 전화 컨벤션." 그것은 지정하는 방법(낮은 수준에서)컴파일러는 것입니다 통과하는 입력한 매개변수 함수를 검색한 결과를 실행합니다.

많은 다른 통화는 규칙기 stdcallcdecl.

당신이 생각하는 단 하나의 방법이있다,그것은 그러나 현실에서,수십가 할 수 있는 방법에는 함수를 호출 및 통과하는 변수입니다.수치 입력 매개변수에 스택(push,push,push 를 통화pop 을 읽을 입력 매개 변수).또는 아마도 당신은 오히려 그들을 스틱 레지스터(이 fastcall -그것은 맞게하려고 일부 의 입력 파라미터 레지스터에 대한 속도).

하지만 그에 대해 무엇을 주문합니까?당신은 그들을 밀어 왼쪽에서 오른쪽이나 오른쪽에서 왼쪽으?어떤 결과가 단 하나의(지 않는다고 가정하면 참조 매개 변수),이렇게 당신이 결과에 스택,등록정한 메모리 주소는?

또한다고 가정하자를 사용할 스택에 대한 통신들의 작업은 그것을 실제로 스택을 취소한 후에는 함수를 호출-호출자 또는 수신자가?

무엇을 백업하는 방법에 대한 후 복원하는 내용(특정)CPU 레지스터-해야 호출자는것,또는 수신자를 보장하는 것이 반환 모든 방법으로는 이유는 무엇입니까?

가장 인기있는 호출 규칙(훨씬)가 cdecl, 는 표준화 컨벤션에서는 C 및 C++.WIN32API 를 사용 stdcall, 즉,모든 코드를 호출하는 WIN32API 를 사용해야 stdcall 한 함수 호출이(만드는 또 다른 인기있는 선택입니다).

fastcall 트의 괴상한 사람은 깨달은 위한 많은 기능을 가진 단 하나의/나 매개 변수를 추진하고 팝업에서 메모리 기반 쌓은 매우 약간의 오버헤드를 만드는 함수 호출을 조금 무거운 그래서 다른 컴파일러를 도입(다)통화 규칙을 것이다 장소 중 하나 이상에서 매개 변수를 등록하기 전에 배치하는 나머지 스택에 대한 더 나은 성능을 제공합니다.문제,모든 컴파일러에 사용되는 동일한 규칙이 어디서 누가 무엇을 가진 fastcall, 고,그 결과로 조심해야 할 때 사용하기 때문에 당신이 그것을 결코 알지 못할 것이 무엇.마지막으로,참조 은 fastcall 정말 빠르니까? 에 대한 정보 fastcall 성능 혜택을 누릴 수 있습니다.

복잡한 물건입니다.

뭔가 중요한 것을 명심하십시오:를 추가하지 않거나 변경 호출 규칙을 알지 못하는 경우 정확히 무엇을 하고 있기 때문에,두 경우에 발신자와 수신자가 동의하지 않는 호출 규칙에,당신은 가능성이 끝까지 스택과 함께 손상 및 세그멘테이션.이것은 일반적으로 발생 할 때 이 함수 호출되는 것에 DLL/공유 라이브러리와 프로그램은 기록에 따라 DLL/ETC/dylib 되는 특정 부칙(말 cdecl음),라이브러리를 다시 컴파일을 다른 호출 규칙(말 fastcall).지금 오래된 프로그램할 수 있는 더 이상 소통과 함께 새로운 라이브러리입니다.

다른 팁

Wikipedia는

FastCall이라는 자격이있는 규칙은 표준화되지 않았으며 컴파일러 공급 업체에 따라 다르게 구현되었습니다.일반적으로 FastCall 호출 규칙은 레지스터에서 하나 이상의 인수를 통과시켜 통화에 필요한 메모리 액세스 수를 줄입니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top