역사적으로 왜 모든 사람과 그들의 동생이 자신의 소명 규칙을 정의한 것처럼 보이는 이유는 무엇입니까? 당신은 C, C++, Windows, Pascal, Fortran, Fastcall을 가지고있을 것입니다. 대다수의 유스 케이스에 대해 하나의 컨벤션이 가장 효율적이지 않아야합니까? 다른 하나를 선호하는 좋은 이유가 있습니까?왜 다른 많은 전화 규칙이 있습니까?
답변
언급하는 호출 규칙은 언어와 하드웨어에 따라 수십 년 동안 설계되었습니다. 그들 모두에는 다른 목표가있었습니다. cdecl은 printf의 가변 인자를 지원했다. stdcall은 코드 gen을 작게했지만 가변 인수는 없었습니다. Fastcall은 구형 컴퓨터에서 하나 또는 두 개의 인수만으로 간단한 함수의 성능을 크게 향상시킬 수 있습니다 (그러나 오늘날의 속도는 거의 없습니다.)
Windows에서 x64가 도입되었을 때보다 Windows에서 적어도 단일 호출 규칙.
Raymond Chen은 전화 회의 관례에 관한 훌륭한 시리즈를 작성했으며 here을 시작할 수 있습니다.
나는 Raymond Chen 기사를 좋아합니다. 그것은 많은 질문에 답했습니다. – dsimcha
역사적으로 모든 사람과 그들의 동생이 자신의 소명 규칙을 정의했기 때문에. 그것들은 모두 다른 목적으로 만들어 졌기 때문에 다른 성능 요구에 의해 구동되었습니다. 예를 들어, C++은 this
매개 변수를 전달하기위한 최적화를 선호합니다.
- 그 중 일부는 성능면에서 효율적이고 다른 일부는 코드 크기면에서 더 효율적입니다.
- 일부 기능 (가변 인수 개수)은 일부 규칙에서만 지원됩니다.
추가 정보 : 이유 http://en.wikipedia.org/wiki/X86_calling_conventions
일부는 마이크로 프로세서 (또는 프로세서)의 기본 구조입니다. 대부분의 언어는 특정 CPU에서 시작하여 해당 아키텍처와 조금 얽혀 있습니다. 예를 들어 구형 Univac 1100 시리즈 컴퓨터에는 호출 스택조차 없었습니다!
다른 이유 중 하나는 여러 가지 방법으로 시도 할 때까지 최상의 솔루션을 예측할 수 없다는 것입니다.
그들은 다른 목적으로, 그리고 다른 최적화 시스템으로 만들어졌습니다.
예를 들어 스택 오버플로를 줄이려면 어떤 사람들은 스택 오버 플로우를 만들기 위해 함수를 호출하는 다양한 아이디어를 생각했습니다.
또 다른 인스턴스는 람다 미적분입니다. 너무 막연한 것은 아니지만 Lambda에서 함수는 하나의 인수 만 전달하고 하나의 값을 반환 할 수 있으므로 자체 호출 규칙도 필요합니다.
+1 그 두 번째 질문! – Poni