यदि कोई फ़ंक्शन ओवरलोडिंग नहीं है, तो फ़ंक्शन का नाम फ़ंक्शन कोड के पते के रूप में कार्य करता है, और जब कोई फ़ंक्शन कॉल किया जाता है, तो उसका पता इसके नाम का उपयोग करना आसान होता है। हालांकि फ़ंक्शन ओवरलोडिंग के साथ, प्रोग्राम को सही फ़ंक्शन पता कैसे मिल सकता है? क्या वर्चुअल टेबल की तरह एक छिपी हुई तालिका है जो अधिभारित कार्यों को उनके पते के साथ संग्रहीत करती है? आपका बहुत बहुत धन्यवाद!सी ++ में फ़ंक्शन ओवरलोडिंग को आम तौर पर कार्यान्वित किया जाता है?
उत्तर
कंपाइलर कॉल को देख सकता है, और ज्ञात मौजूदा अधिभारित कार्यान्वयन के खिलाफ मेल खाता है, और सही चुन सकता है। एक गतिशील तालिका की कोई ज़रूरत नहीं है, यह संकलन-समय पर स्थिर रूप से पूरी तरह से करने योग्य है।
अद्यतन: अलग ढंग से नाम कार्यों कि संकलक के बीच चयन कर सकते हैं दिखा कर संकल्पना को समझाने पर मेरे प्रयास से हटा दिया।
लोग इस तकनीकी नाम Mangling कहते हैं। इस खोजशब्द को खोजें। – SunnyShah
नाम मैंगलिंग सिर्फ पहचानकर्ताओं के नाम, अधिभारित या नहीं के बीच अंतर करने के लिए है। नाम मैंगलिंग का मुख्य उद्देश्य ओवरलोडिंग को पूरा नहीं करना है, लेकिन संघर्षों को नाम देने से बचने के लिए। अधिभारित मामले में, कंपाइलर को कॉल करना है कि कौन सी विधि कॉल करें और यही वह जगह है जहां मुख्य तर्क है। मेरा मानना है कि ओपी जानना चाहता था कि यह संकलन समय/रनटाइम चीज़ था या नहीं। –
यह सटीक नहीं है, आमतौर पर यह लिंकर होता है जिसे कॉल पता की गणना करने की आवश्यकता होती है। नाम सजावट बहुत मायने रखती है। हां, यदि लिंक एक ही अनुवाद इकाई में स्थित होता है तो लिंक अनुरोध को छोड़ने का अवसर होता है। चाहे वह वास्तव में होता है एक कार्यान्वयन विस्तार है। –
यह है, मुझे विश्वास है, नाम mangling के माध्यम से प्राप्त:
कार्यों आप foo के रूप में जानते (पूर्णांक) और foo (डबल) वास्तव में int_foo की तरह कुछ नाम हैं() और double_foo() (या इसी तरह, मैं मैं सी ++ के लिए नियोजित विशेष अर्थशास्त्र के बारे में पूरी तरह से सुनिश्चित नहीं हूं)। इसका मतलब है कि सी ++ प्रतीकों आमतौर पर कोड में दिए गए नामों की तुलना में परिमाण का एक बड़ा क्रम होता है।
अतिभारित कार्यों संकलन समय पर हल कर रहे हैं। कंपाइलर पैरामीटर के दिए गए सेट के लिए एक उपयुक्त मैच पाता है और बस इसके पते से संबंधित फ़ंक्शन को कॉल करता है (void foo(int)
और void foo()
व्यावहारिक रूप से दो पूरी तरह से स्वतंत्र फ़ंक्शन हैं - यदि आपके कोड में foo(4)
है, तो संकलक जानता है कि कौन सा फ़ंक्शन कॉल करना है)।
तुम इतनी तरह एक ही कक्षा की अतिभारित विधियों, के बारे में बात कर रहे हैं:
void function(int n);
void function(char *s);
...
objectInstance->function("Hello World")
यह एक संकलन समय thingy है। कंपाइलर जानता है (या कुछ परिस्थितियों में, सबसे अच्छा अनुमान लगाता है) इस बिंदु पर कॉल करने की विधि।
एक टिप्पणी मैं प्रश्न में बनाया है, मैं यहाँ दोहराएँ।
जो लोग नाम mangling सुझाव है गुमराह मुझे लगता है कि कर रहे हैं। ऐसा नहीं है कि संकलक नाम को उलझाता है और उलझन वाले नामों के बीच एक लुकअप करता है। इसे उपलब्ध विधियों से उचित प्रकारों का अनुमान लगाने की आवश्यकता है। एक बार ऐसा करने के बाद, यह पहले से ही जानता है कि किस विधि को कॉल करना है। इसके बाद यह mangled नाम अंतिम चरण के रूप में उपयोग करता है। नाम मैंगलिंग यह निर्धारित करने के लिए एक शर्त नहीं है कि किस ओवरलोडेड फ़ंक्शन को कॉल किया जाए।
उस व्यक्ति को जिसने -1 दिया था। कम से कम एक टिप्पणी छोड़ दो। अगर जानकारी गलत है तो मैं पोस्ट को हटा/संपादित कर सकता हूं। मुझे भी सीखने का मौका दो! –
मुझे लगता है कि उस व्यक्ति (मुझे नहीं) नीचे गिरा दिया गया क्योंकि आपने वास्तव में स्पष्ट उत्तर नहीं दिया था। इसके बजाय आप बस "संकलन समय" कहें और "कंपाइलर सिर्फ जानता है कि क्या करना है", जो वास्तव में थोड़ा गलत है। – AndiDog
खैर, नाम मैंगलिंग गलत है, आईएमओ। सबसे अच्छा हम कह सकते हैं "कंपाइलर जानता है"। प्रत्येक कंपाइलर का अपना कार्यान्वयन हो सकता है। –
समारोह हस्ताक्षर समारोह नाम + पैरामीटर (रों) टाइप (रों)
Name mangling से बना है।
यह सब संकलन समय पर किया जाता है। सी ++ संकलक वास्तव में, फ़ंक्शन नाम आप इसे आंतरिक रूप देने को संशोधित करता है ताकि तरह
int foo(int a, float b, char c)
एक समारोह आंतरिक रूप से एक नाम बराबर
func_foo_int_float_char()
करने के लिए (असली प्रतीक आमतौर पर [email protected]@@[email protected]
जैसे कुछ गॉबल्डीगुक है) हो जाता है।
जैसा कि आप देख सकते हैं, नाम सही संख्या और पारित पैरामीटर के प्रकार के आधार पर सजाया गया है।इसलिए, जब आप कोई फ़ंक्शन कॉल करते हैं, तो संकलक के लिए आपके द्वारा पारित पैरामीटर को देखना आसान होता है, उनके साथ फ़ंक्शन नाम सजाने के लिए, और सही प्रतीक के साथ आना आसान होता है। उदाहरण के लिए,
int a, b; float f; char c;
foo(a,f,c) ; // compiler looks for an internal symbol called func_foo_int_float_char
foo(a,b,c) ; // compiler looks for a symbol called func_foo_int_int_char
फिर, यह सब पूरी तरह से संकलन समय पर किया जाता है।
भले ही कोई फ़ंक्शन ओवरलोड न हो, कंपेलर आम तौर पर फ़ंक्शन और वेरिएबल नामों को जोड़ते हैं। इसे name mangling कहा जाता है। यह सी और सी ++ दोनों में होता है। फ़ंक्शन नाम को विशेष रूप से (1) कॉलिंग कन्वेंशन द्वारा सजाया जा सकता है, (2) सी ++ फ़ंक्शन ओवरलोडिंग, (3) क्लास सदस्य फ़ंक्शन।
जीएनयू c++filt
binutil इस घायल नाम undecorate सकते हैं, और Windows में, वहाँ UnDecorateSymbolName
सी ++ compilers (प्रत्येक अधिभार के लिए अलग अलग नाम) नाम mangling का उपयोग वस्तु फ़ाइल में कार्यों के बीच अंतर करना है। उदाहरण के लिए
int test(int a){}
int test(float a,float b){}
int test(double a){}
int testbam(double a){}
प्रतीक नाम __Z4testi
, __Z4testff
, __Z4testd
, __Z7testbamd
उत्पादन होगा। यह नाम मैंगलिंग अत्यधिक संकलक-निर्भर (दुख की बात है) और कई कारणों में से एक है जिसे अक्सर सी ++ पर सी पसंद किया जाता है।
फ़ंक्शन test
पर कॉल करते समय, कंपाइलर प्रत्येक कार्य ओवरलोड के विरुद्ध दिए गए तर्क प्रकारों और तर्कों की संख्या से मेल खाता है। फ़ंक्शन प्रोटोटाइप का उपयोग तब पता लगाने के लिए किया जाता है कि किसको कॉल किया जाना चाहिए।
- 1. आम तौर पर सी #
- 2. नक्शा-नेविगेशन परियोजना, सड़क डेटा आम तौर पर कैसे संग्रहीत/प्रतिनिधित्व किया जाता है?
- 3. एएसपी.नेट एमवीसी - आम तौर पर प्रयुक्त ड्रॉपडाउनलिस्ट
- 4. यादृच्छिक() फ़ंक्शन के अंदर - यह कैसे कार्यान्वित किया जाता है?
- 5. इकाई फ्रेमवर्क - आम तौर पर प्रचलित Enums?
- 6. जब धागे आम तौर पर उपज चाहिए?
- 7. आंतरिक तरीकों को कैसे कार्यान्वित किया जाता है
- 8. std :: tuple कैसे कार्यान्वित किया जाता है?
- 9. क्या विजुअल एसवीएन सर्वर आम तौर पर भरोसेमंद एसवीएन सर्वर के रूप में देखा जाता है?
- 10. आकार का ऑपरेटर सी ++ में कैसे कार्यान्वित किया जाता है?
- 11. आप आम तौर पर प्रोग्राम को सुंदर कैसे दिखते हैं?
- 12. जावा के साथ आम तौर पर पर मैक ओएस
- 13. "कॉन्स्ट" कैसे कार्यान्वित किया जाता है?
- 14. ऑब्जेक्टिव-सी प्रतिनिधियों को आम तौर पर बनाए रखने के बजाय संपत्ति असाइनमेंट क्यों दिया जाता है?
- 15. वेब ऐप्स में आम तौर पर प्रयुक्त कीबोर्ड शॉर्टकट
- 16. क्यों आम 'लिस्पडा में आम लिस्प में प्रयोग किया जाता है?
- 17. CTRL + C आम तौर पर एक सिनात्रा एप्लिकेशन
- 18. आम तौर पर प्रयुक्त क्रियाओं के लिए प्रतीक बनाम पाठ
- 19. ओएस आम तौर पर कर्नेल मेमोरी और पेज हैंडलिंग के प्रबंधन के बारे में कैसे जाता है?
- 20. ओपनआईडी कैसे कार्यान्वित किया जाता है?
- 21. लेक्सिकल स्कोपिंग कैसे कार्यान्वित किया जाता है?
- 22. स्कोप आम तौर पर नेस्टेड फ़ंक्शंस के उपयोग को कैसे प्रभावित करता है?
- 23. कैसे एसक्यूएल इंजेक्शन आम तौर पर एक स्प्रिंग/हाइबरनेट सेटअप
- 24. एप्लिकेशन वर्चुअलाइजेशन कैसे कार्यान्वित किया जाता है?
- 25. बिगडिसीमल कैसे कार्यान्वित किया जाता है?
- 26. pthread_join कैसे कार्यान्वित किया जाता है?
- 27. Math.Pow() .NET Framework में कार्यान्वित कैसे किया जाता है?
- 28. पायथन में __slots__ कैसे कार्यान्वित किया जाता है?
- 29. ऑब्जेक्ट.गेटहाशकोड() सीएलआर और जेवीएम में कैसे कार्यान्वित किया जाता है?
- 30. म्यूटेक्स और लॉक संरचनाओं को कैसे कार्यान्वित किया जाता है?
जो लोग नाम मैंगलिंग का सुझाव देते हैं, वे मुझे गुमराह करते हैं। ऐसा नहीं है कि संकलक नाम को उलझाता है और उलझन वाले नामों के बीच एक लुकअप करता है। इसे उपलब्ध विधियों से उचित प्रकारों का अनुमान लगाने की आवश्यकता है। एक बार ऐसा करने के बाद, यह पहले से ही जानता है कि किस विधि को कॉल करना है। इसके बाद यह mangled नाम _last_ चरण के रूप में उपयोग करता है। नाम मैंगलिंग यह निर्धारित करने के लिए एक शर्त नहीं है कि किस ओवरलोडेड फ़ंक्शन को कॉल किया जाए। –
शायद यह टिप्पणी उन भ्रमित उत्तरों में से एक में जाना चाहिए जिसका आप उल्लेख कर रहे हैं? – Manuel
बहुत सारे हैं, इसलिए मैंने इसे यहां छोड़ा। –