답변
이것은 32 비트 코드에 대한 파스칼 호출 규칙에 적용되었습니다. Pascal은 OS/2 및 Windows 3과 같은 16 비트 운영 체제의 호출 규칙입니다. 왜 파스칼을 선택했는지 조금 추측 할 수 있습니다. 당시 조그마한 강아지 였지만 약간 효율적이었습니다. 640 KB가 당신이 함께 일해야 할 때 중요했던 것.
대부분의 Win32 함수는 링커에 표시되기 전에 내 보낸 함수가 어떻게 꾸며 지는지를 지정하기 때문에 true stdcall이 아닙니다. void Mumble (int arg)와 같이 _Mumble @ 4가됩니다. @ 뒤의 숫자는 활성화 프레임 크기를 나타냅니다. 그러나 대부분의 Win32 함수는 장식없이 내보내집니다. 아마도 프로그래머에게 GetProcAddress()를 작동시킬 수있는 싸울 기회를주기 위해서 일 것이다. 필자는 링커가 선언 된 API 함수 시그니처와 실제 함수 시그니처 간의 불일치를 감지 할 수 있도록 도와 주었다고 생각합니다. 전달 된 인수의 수가 불일치하는 것은 자동 kaboom입니다. 호출 수신자가 스택에서 더 많은 또는 더 적은 인수를 넘겨 받아 전달 된 이후입니다. 진단하기도 어렵습니다. stdcall의 취약점 인 cdecl 협약에는이 문제가 없습니다.
내부 호출은 stdcall, cdecl 및 thiscall 사이의 혼합 백입니다. 단일 단계 Windows 코드가 내가 좋아하는 일이 아니지만 필자가 패턴을 발견했다고 말할 수는 없습니다.
심볼 장식이 부족하여 winapi 바이너리가 심볼 장식이 없으므로 (장식을 벗기거나 서기를 사용하는)'.def' 파일을 사용하여 GetProcAddress를 통해 간단하게 가져옵니다. – Necrolis
좋은 지적, 네가 맞다고 생각해. –
stdcall로 컴파일 된 코드는 cdecl (대안)으로 컴파일 된 코드보다 상당히 작습니다. 결정이 내려 졌을 때, 더 작은 코드는 더 빠른 코드였습니다.
실제로 나는 Hans Passant의 대답을 선호했지만, 뭐든간에. –
오랫동안 Microsoftee 였으므로 귀하의 대답을 선택했습니다. – Benjamin
그 주장에 대한 증거가 있습니까? 직관적으로 나는 그것이 stdcall과 cdecl 사이의 씻어 야한다고 생각하고 검색하는 것은 두 가지 호출 규칙 사이의 크기 비교를 생각지 않는다. –
- 1. 왜 Microsoft는 ASP.net MVC를 만들기 위해 MVC를 선택 했습니까?
- 2. Microsoft는 귀하에게 그 비용을 지불 했습니까?
- 3. 연혁 : 왜 Eclipse Foundation이 OSGi를 선택 했습니까?
- 4. stdcall을 이름
- 5. 왜 Microsoft는 Mono와 Moonlight를 방해하지 않겠습니까?
- 6. Microsoft는 왜 자신의 클래스에 확장 메서드를 사용합니까?
- 7. 왜 Microsoft는 asp.net 1.1과 asp.net 2.0 사이에서 asp.net 프로젝트 유형을 변경 했습니까?
- 8. UITableView가 선택 했습니까?
- 9. DatagridView 확인란을 선택 했습니까?
- 10. Microsoft는 Linq에서 .NET 4.0의 엔티티 성능 문제를 수정 했습니까?
- 11. 왜 C++에서 참조 용 기호로 앰퍼샌드를 선택 했습니까?
- 12. 왜 Microsoft는 DirectX10 파이프 라인 변수에 "g_"명명 규칙을 사용합니까?
- 13. Microsoft는 BLOB 저장소 용 WebDAV보다 RESTful API를 선택하는 이유는 무엇입니까?
- 14. 왜 Microsoft는 ASP.Net 용 '적절한'AJAX 그리드를 출시하지 않습니까?
- 15. 왜 hasExited가 'System.ComponentModel.Win32Exception'을 throw 했습니까?
- 16. 왜 TableView가 위로 이동 했습니까?
- 17. 왜 SQLSyntaxErrorException이 발생합니다 - ""발생 했습니까?
- 18. 왜 Jenkins가 허드슨으로 업그레이드하라고 했습니까?
- 19. 왜 MySQLi는 진술을 준비 했습니까?
- 20. JQuery가 탭 문제를 선택 했습니까?
- 21. IllegalArgumentException에 해당하는 항목을 선택 했습니까?
- 22. Google과 Microsoft는 AppData 폴더에 응용 프로그램을 설치합니다. 왜 그렇지 않습니까?
- 23. LDAP C++ API 선택
- 24. JavaScript 드로잉 API 선택
- 25. 어째서 adwords api AuthenticationError가 발생 했습니까?
- 26. 왜 rDNS가 IP 주소를 저장 했습니까?
- 27. 자카르타 jsp 로그 taglib은 왜 은퇴 했습니까?
- 28. Sun은 String.hashCode() 구현을 왜 지정 했습니까?
- 29. 매우 긴 함수를 작성 했습니까? 그렇다면 왜?
- 30. BizTalk에서 왜 MSI 파일을 가져오고 설치 했습니까?
왜 Microsoft는 API 협약으로 * stdcall을 선택 했습니까? – JustBoo
감사합니다 Constantin :) – Benjamin