मैंने कई कार्यों से पहले fastcall
नोटेशन जोड़ा है। इसका उपयोग क्यों किया जाता है?विज़ुअल सी में उपयोग किए जाने वाले फास्टकॉल कीवर्ड क्या है?
उत्तर
फ़ंक्शन से पहले नोटेशन को "कॉलिंग कन्वेंशन" कहा जाता है। यह निर्दिष्ट करता है कि (निम्न स्तर पर) कंपाइलर फ़ंक्शन में इनपुट पैरामीटर पास करेगा और इसे निष्पादित होने के बाद इसके परिणाम पुनर्प्राप्त करेगा।
कई अलग-अलग कॉलिंग सम्मेलन हैं, सबसे लोकप्रिय stdcall
और cdecl
है।
आपको लगता है कि ऐसा करने का केवल एक ही तरीका है, लेकिन हकीकत में, कई तरीके हैं जिन्हें आप एक समारोह कह सकते हैं और वेरिएबल्स को पास और बाहर कर सकते हैं। आप इनपुट पैरामीटर को स्टैक पर रख सकते हैं (पुश, पुश, कॉल टू पुश; पॉप, पॉप, पॉप इनपुट इनपुट पैरामीटर पढ़ने के लिए)। या शायद आप उन्हें रजिस्टरों में चिपके रहेंगे (यह fastcall
है - यह गति के लिए रजिस्टरों में कुछ इनपुट पैरा को फिट करने का प्रयास करता है)।
लेकिन फिर आदेश के बारे में क्या? क्या आप उन्हें बाएं से दाएं या दाएं से बाएं धक्का देते हैं? नतीजे के बारे में क्या - हमेशा एक ही होता है (कोई संदर्भ पैरामीटर नहीं मानता है), तो क्या आप एक निश्चित स्मृति पते पर, रजिस्टर में, स्टैक पर परिणाम डालते हैं?
साथ ही, मान लीजिए कि आप संचार के लिए ढेर का उपयोग कर रहे हैं - काम करने के बाद वास्तव में स्टैक को साफ़ करना है - कॉलर या कैली?
बैक अप लेने और फिर (निश्चित) CPU रजिस्टरों की सामग्री को पुनर्स्थापित करने के बारे में क्या - क्या कॉलर इसे कर सकता है, या कैली गारंटी देगी कि यह सबकुछ वापस लौटाएगा?
सबसे लोकप्रिय कॉलिंग सम्मेलन (दूर तक) cdecl
है, जो सी और सी ++ दोनों में मानक कॉलिंग सम्मेलन है। WIN32 API stdcall
का उपयोग करता है, जिसका अर्थ है कि WIN32 API को कॉल करने वाले किसी भी कोड को उन फ़ंक्शन कॉल के लिए stdcall
का उपयोग करने की आवश्यकता है (इसे एक और लोकप्रिय पसंद बनाते हैं)।
fastcall
एक विषम गेंद है - लोगों को केवल एक इन/आउट पैरामीटर के साथ कई कार्यों के लिए एहसास हुआ है, मेमोरी-आधारित स्टैक से धक्का और पॉपिंग करना काफी अधिक है और फ़ंक्शन को थोड़ा भारी कहते हैं ताकि अलग-अलग कंपाइलर्स (अलग-अलग) कॉलिंग सम्मेलन पेश करते हैं जो बेहतर प्रदर्शन के लिए बाकी स्टैक में रखने से पहले रजिस्टरों में एक या अधिक पैरामीटर रखेंगे। समस्या यह है कि सभी कंपाइलर्स एक ही नियम का इस्तेमाल नहीं करते हैं, जहां fastcall
के साथ क्या होता है और परिणामस्वरूप आपको इसका उपयोग करते समय सावधान रहना पड़ता है क्योंकि आप कभी नहीं जानते कि कौन करता है। अंत में, fastcall
प्रदर्शन लाभ पर जानकारी के लिए Is fastcall really faster? देखें।
जटिल सामग्री।
ध्यान में रखना महत्वपूर्ण है: यदि आप बिल्कुल नहीं जानते हैं तो आप कॉलिंग सम्मेलनों को जोड़ या परिवर्तित नहीं करते हैं, क्योंकि यदि कॉलर और कैली दोनों कॉलिंग सम्मेलन पर सहमत नहीं हैं, आप शायद ढेर भ्रष्टाचार और एक segfault के साथ खत्म हो जाएगा।यह आमतौर पर तब होता है जब आपके पास एक डीएलएल/साझा लाइब्रेरी में फ़ंक्शन कहा जाता है और एक प्रोग्राम लिखा जाता है जो डीएलएल/एसओ/डाइलिब पर एक निश्चित कॉलिंग सम्मेलन (कहते हैं, cdecl
) पर निर्भर करता है, फिर लाइब्रेरी को एक अलग कॉलिंग के साथ दोबारा सम्मिलित किया जाता है सम्मेलन (कहें, fastcall
)। अब पुराना कार्यक्रम अब नई पुस्तकालय के साथ संवाद नहीं कर सकता है।
कन्वेंशनों fastcall हकदार मानकीकृत नहीं गया है, और अलग ढंग से लागू किया गया है, संकलक वेंडर के आधार पर। आम तौर पर फास्टकॉल कॉलिंग सम्मेलन रजिस्टरों में एक या एक से अधिक तर्क पारित करते हैं जो कॉल के लिए आवश्यक स्मृति पहुंच की संख्या को कम कर देता है।
यह एक सी बात नहीं है, यह एक एमएसवीसी चीज है। –
सीएसपी – Mehrdad
के बिना एमएसवीसी का जादू नहीं कर सकता है जो भी इसे बंद करने के लिए मतदान करता है: यह वास्तविक सवाल नहीं है? हां, यह छोटा और बिंदु है, लेकिन यह निश्चित रूप से एक बहुत स्पष्ट उत्तर के साथ एक बहुत स्पष्ट सवाल है। –