2010-02-09 9 views
17

यदि कोई फ़ंक्शन ओवरलोडिंग नहीं है, तो फ़ंक्शन का नाम फ़ंक्शन कोड के पते के रूप में कार्य करता है, और जब कोई फ़ंक्शन कॉल किया जाता है, तो उसका पता इसके नाम का उपयोग करना आसान होता है। हालांकि फ़ंक्शन ओवरलोडिंग के साथ, प्रोग्राम को सही फ़ंक्शन पता कैसे मिल सकता है? क्या वर्चुअल टेबल की तरह एक छिपी हुई तालिका है जो अधिभारित कार्यों को उनके पते के साथ संग्रहीत करती है? आपका बहुत बहुत धन्यवाद!सी ++ में फ़ंक्शन ओवरलोडिंग को आम तौर पर कार्यान्वित किया जाता है?

+4

जो लोग नाम मैंगलिंग का सुझाव देते हैं, वे मुझे गुमराह करते हैं। ऐसा नहीं है कि संकलक नाम को उलझाता है और उलझन वाले नामों के बीच एक लुकअप करता है। इसे उपलब्ध विधियों से उचित प्रकारों का अनुमान लगाने की आवश्यकता है। एक बार ऐसा करने के बाद, यह पहले से ही जानता है कि किस विधि को कॉल करना है। इसके बाद यह mangled नाम _last_ चरण के रूप में उपयोग करता है। नाम मैंगलिंग यह निर्धारित करने के लिए एक शर्त नहीं है कि किस ओवरलोडेड फ़ंक्शन को कॉल किया जाए। –

+0

शायद यह टिप्पणी उन भ्रमित उत्तरों में से एक में जाना चाहिए जिसका आप उल्लेख कर रहे हैं? – Manuel

+0

बहुत सारे हैं, इसलिए मैंने इसे यहां छोड़ा। –

उत्तर

11

कंपाइलर कॉल को देख सकता है, और ज्ञात मौजूदा अधिभारित कार्यान्वयन के खिलाफ मेल खाता है, और सही चुन सकता है। एक गतिशील तालिका की कोई ज़रूरत नहीं है, यह संकलन-समय पर स्थिर रूप से पूरी तरह से करने योग्य है।

अद्यतन: अलग ढंग से नाम कार्यों कि संकलक के बीच चयन कर सकते हैं दिखा कर संकल्पना को समझाने पर मेरे प्रयास से हटा दिया।

+0

लोग इस तकनीकी नाम Mangling कहते हैं। इस खोजशब्द को खोजें। – SunnyShah

+4

नाम मैंगलिंग सिर्फ पहचानकर्ताओं के नाम, अधिभारित या नहीं के बीच अंतर करने के लिए है। नाम मैंगलिंग का मुख्य उद्देश्य ओवरलोडिंग को पूरा नहीं करना है, लेकिन संघर्षों को नाम देने से बचने के लिए। अधिभारित मामले में, कंपाइलर को कॉल करना है कि कौन सी विधि कॉल करें और यही वह जगह है जहां मुख्य तर्क है। मेरा मानना ​​है कि ओपी जानना चाहता था कि यह संकलन समय/रनटाइम चीज़ था या नहीं। –

+0

यह सटीक नहीं है, आमतौर पर यह लिंकर होता है जिसे कॉल पता की गणना करने की आवश्यकता होती है। नाम सजावट बहुत मायने रखती है। हां, यदि लिंक एक ही अनुवाद इकाई में स्थित होता है तो लिंक अनुरोध को छोड़ने का अवसर होता है। चाहे वह वास्तव में होता है एक कार्यान्वयन विस्तार है। –

0

यह है, मुझे विश्वास है, नाम mangling के माध्यम से प्राप्त:

कार्यों आप foo के रूप में जानते (पूर्णांक) और foo (डबल) वास्तव में int_foo की तरह कुछ नाम हैं() और double_foo() (या इसी तरह, मैं मैं सी ++ के लिए नियोजित विशेष अर्थशास्त्र के बारे में पूरी तरह से सुनिश्चित नहीं हूं)। इसका मतलब है कि सी ++ प्रतीकों आमतौर पर कोड में दिए गए नामों की तुलना में परिमाण का एक बड़ा क्रम होता है।

3

अतिभारित कार्यों संकलन समय पर हल कर रहे हैं। कंपाइलर पैरामीटर के दिए गए सेट के लिए एक उपयुक्त मैच पाता है और बस इसके पते से संबंधित फ़ंक्शन को कॉल करता है (void foo(int) और void foo() व्यावहारिक रूप से दो पूरी तरह से स्वतंत्र फ़ंक्शन हैं - यदि आपके कोड में foo(4) है, तो संकलक जानता है कि कौन सा फ़ंक्शन कॉल करना है)।

5

तुम इतनी तरह एक ही कक्षा की अतिभारित विधियों, के बारे में बात कर रहे हैं:

void function(int n); 
void function(char *s); 
... 

objectInstance->function("Hello World") 

यह एक संकलन समय thingy है। कंपाइलर जानता है (या कुछ परिस्थितियों में, सबसे अच्छा अनुमान लगाता है) इस बिंदु पर कॉल करने की विधि।

एक टिप्पणी मैं प्रश्न में बनाया है, मैं यहाँ दोहराएँ।

जो लोग नाम mangling सुझाव है गुमराह मुझे लगता है कि कर रहे हैं। ऐसा नहीं है कि संकलक नाम को उलझाता है और उलझन वाले नामों के बीच एक लुकअप करता है। इसे उपलब्ध विधियों से उचित प्रकारों का अनुमान लगाने की आवश्यकता है। एक बार ऐसा करने के बाद, यह पहले से ही जानता है कि किस विधि को कॉल करना है। इसके बाद यह mangled नाम अंतिम चरण के रूप में उपयोग करता है। नाम मैंगलिंग यह निर्धारित करने के लिए एक शर्त नहीं है कि किस ओवरलोडेड फ़ंक्शन को कॉल किया जाए।

+0

उस व्यक्ति को जिसने -1 दिया था। कम से कम एक टिप्पणी छोड़ दो। अगर जानकारी गलत है तो मैं पोस्ट को हटा/संपादित कर सकता हूं। मुझे भी सीखने का मौका दो! –

+0

मुझे लगता है कि उस व्यक्ति (मुझे नहीं) नीचे गिरा दिया गया क्योंकि आपने वास्तव में स्पष्ट उत्तर नहीं दिया था। इसके बजाय आप बस "संकलन समय" कहें और "कंपाइलर सिर्फ जानता है कि क्या करना है", जो वास्तव में थोड़ा गलत है। – AndiDog

+0

खैर, नाम मैंगलिंग गलत है, आईएमओ। सबसे अच्छा हम कह सकते हैं "कंपाइलर जानता है"। प्रत्येक कंपाइलर का अपना कार्यान्वयन हो सकता है। –

-1

समारोह हस्ताक्षर समारोह नाम + पैरामीटर (रों) टाइप (रों)

12

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 

फिर, यह सब पूरी तरह से संकलन समय पर किया जाता है।

+6

यह दूसरा रास्ता है। कंपाइलर पहले सभी फूज़ को देखता है, जो मानक में सभी नियमों के अनुसार मेल खाता है, और फिर शायद लिंकर के लिए एक उलझन वाला नाम निकलता है। – UncleBens

+0

बहुत जानकारीपूर्ण, धन्यवाद। – Dasaru

-1

भले ही कोई फ़ंक्शन ओवरलोड न हो, कंपेलर आम तौर पर फ़ंक्शन और वेरिएबल नामों को जोड़ते हैं। इसे name mangling कहा जाता है। यह सी और सी ++ दोनों में होता है। फ़ंक्शन नाम को विशेष रूप से (1) कॉलिंग कन्वेंशन द्वारा सजाया जा सकता है, (2) सी ++ फ़ंक्शन ओवरलोडिंग, (3) क्लास सदस्य फ़ंक्शन।

जीएनयू c++filt binutil इस घायल नाम undecorate सकते हैं, और Windows में, वहाँ UnDecorateSymbolName

-1

सी ++ 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 पर कॉल करते समय, कंपाइलर प्रत्येक कार्य ओवरलोड के विरुद्ध दिए गए तर्क प्रकारों और तर्कों की संख्या से मेल खाता है। फ़ंक्शन प्रोटोटाइप का उपयोग तब पता लगाने के लिए किया जाता है कि किसको कॉल किया जाना चाहिए।

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