2010-08-24 9 views
5

क्या कोई अच्छा कारण है?माइक्रोसॉफ्ट ने अपने एपीआई सम्मेलन के रूप में stdcall क्यों चुना?

क्या उनके आंतरिक कार्य (निर्यात नहीं किए गए) भी स्टडकॉल सम्मेलन हैं?

+0

माइक्रोसॉफ्ट * ने अपने एपीआई सम्मेलन के रूप में * stdcall क्यों चुना? – JustBoo

+0

धन्यवाद कॉन्स्टेंटिन :) – Benjamin

उत्तर

8

यह 32-बिट कोड के लिए पास्कल कॉलिंग सम्मेलन का अनुकूलन था। पास्कल ओएस/2 और विंडोज़ जैसे 16-बिट ऑपरेटिंग सिस्टम के लिए कॉलिंग कन्वेंशन था। क्यों पास्कल चुना गया था, अनुमान लगाया गया था, फिर भी मैं थोड़ा छोटा पिल्ला था, लेकिन यह थोड़ा और अधिक कुशल था। जिसने 640 केबी के साथ काम करना था, उस पर वापस लौटाया गया था।

अधिकांश Win32 फ़ंक्शंस सत्य stdcall नहीं हैं क्योंकि यह भी निर्धारित करता है कि निर्यातक फ़ंक्शन को लिंकर को प्रस्तुत करने से पहले सजाया गया है। शून्य माम्बल की तरह (int arg) _Mumble @ 4 बन जाता है। @ सक्रियण फ्रेम आकार का वर्णन करने के बाद संख्या। लेकिन अधिकांश Win32 कार्यों को बिना किसी सजावट के निर्यात किया जाता है। शायद प्रोग्रामर को GetProcAddress() काम करने के लिए एक लड़ने का मौका देना है। मुझे लगता है कि सजावट का उद्देश्य लिंकर को घोषित एपीआई फ़ंक्शन हस्ताक्षर और वास्तविक एक के बीच विसंगतियों का पता लगाने में मदद करना था। उत्तीर्ण तर्कों की संख्या में एक मेल नहीं खाता एक स्वचालित कबूम है क्योंकि कैली ढेर से कम या कम तर्क पॉप अप करेगा, फिर पारित किया गया था। निदान करने के लिए भी मुश्किल है। Stdcall की एक कमजोरी, सीडीसीएल सम्मेलन में यह समस्या नहीं है।

आंतरिक कॉलिंग stdcall, cdecl और thiscall के बीच मिश्रित बैग है। यह नहीं कह सकता कि मैंने कभी भी एक पैटर्न का पता लगाया है, हालांकि सिंगल-स्टेपिंग विंडोज कोड ऐसा कुछ नहीं है जिसे मैं पसंद करता हूं।

+2

प्रतीक सजावट की कमी का कारण है कि winapi binaries निर्यात के लिए '.def' फ़ाइलों का उपयोग करता है (जो सजावट को स्ट्रिप करता है और/या ऑर्डियनल का उपयोग करता है), यह GetProcAddress के माध्यम से आयात करता है, क्योंकि कोई प्रतीक सजावट नहीं है – Necrolis

+0

अच्छा मुद्दा, मुझे लगता है कि आप सही हैं। –

4

stdcall के साथ संकलित कोड cdecl (वैकल्पिक) के साथ संकलित कोड से काफी छोटा है। उस समय निर्णय लिया गया था, छोटे कोड तेज कोड था।

+0

असल में मैंने हंस पासेंट के जवाब को मेरा पसंदीदा पसंद किया, लेकिन जो भी हो। –

+0

क्योंकि आप माइक्रोस्कोफ्ट हैं (लंबे समय तक), मैंने आपका जवाब चुना है। – Benjamin

+0

क्या आपके पास उस दावे के लिए कोई सबूत है? सहजता से मुझे लगता है कि यह stdcall और cdecl के बीच धोना चाहिए और दो कॉलिंग सम्मेलनों के बीच किसी भी आकार की तुलना के साथ गूगलिंग नहीं आती है। –

संबंधित मुद्दे

 संबंधित मुद्दे