> क्या यह सी ++ में ऑब्जेक्ट्स के रूप में कार्यों का उपयोग करने के लिए कोई सुविधा लाता है?
हां: सी ++ टेम्पलेट तंत्र अन्य सभी सी/सी ++ प्रोग्रामिंग शैलियों (सी शैली और ओओपी शैली, नीचे देखें) की अनुमति देता है।
> हम इसके बजाय फ़ंक्शन पॉइंटर का उपयोग क्यों नहीं कर सकते? कोई उदाहरण?
लेकिन हम कर सकते हैं: एक साधारण सी फ़ंक्शन पॉइंटर एक अच्छी तरह से परिभाषित ऑपरेटर() के साथ एक ऑब्जेक्ट भी है। यदि हम लाइब्रेरी डिज़ाइन करते हैं, तो हम किसी भी व्यक्ति को उस सी पॉइंटर शैली का उपयोग करने के लिए बाध्य नहीं करना चाहते हैं, अगर वांछित नहीं है। यह आमतौर पर अवांछित होता है क्योंकि सब कुछ/हर किसी को ओओपी शैली में उपयोग/उपयोग करने के लिए मजबूर किया जाता है; निचे देखो।
सी प्रोग्रामर और कार्यात्मक प्रोग्रामर विचारों से, OOP न केवल अमूर्त की गलत दिशा होने के लिए धीमी लेकिन अधिक वर्बोज़ और ज्यादातर मामलों में हो जाता है ("जानकारी" नहीं है और एक "वस्तु नहीं होना चाहिए ")। इसके कारण, जब भी लोग "ऑब्जेक्ट" शब्द का प्रयोग अन्य संदर्भों में किया जाता है, तब भी लोग भ्रमित होते हैं।
सी ++ में, वांछित गुणों के साथ कुछ भी एक वस्तु के रूप में देखा जा सकता है। इस मामले में, एक साधारण सी फ़ंक्शन पॉइंटर भी एक ऑब्जेक्ट है। यह इस बात का तात्पर्य नहीं है कि वांछित नहीं होने पर ओओपी प्रतिमानों का उपयोग किया जाता है; यह टेम्पलेट तंत्र का उपयोग करने का एक उचित तरीका है।
प्रदर्शन अंतर को समझने के लिए, प्रोग्रामिंग (-language) शैलियों/मानदंड और उनके संभव अनुकूलन की तुलना:
सी शैली: के बंद होने के साथ
- समारोह सूचक (" यह "ओओपी में, कुछ संरचना के लिए सूचक) पहले पैरामीटर के रूप में।
- फ़ंक्शन को कॉल करने के लिए, फ़ंक्शन का पता पहले एक्सेस किया जाना चाहिए।
- यह 1 संकेत है; कोई इनलाइनिंग संभव नहीं है।
सी ++ (और जावा) OOP शैली: एक वस्तु आभासी कार्यों के साथ एक वर्ग से प्राप्त होने वाले
- संदर्भ।
- संदर्भ 1 सूचक है।
- आभासी तालिका में सूचक 2 सूचक है।
- वर्चुअल-टेबल में फ़ंक्शन पॉइंटर तीसरा पॉइंटर है।
- यह 3 संकेत हैं; कोई इनलाइनिंग संभव नहीं है।
सी ++ टेम्पलेट शैली:
- साथ() फ़ंक्शन किसी ऑब्जेक्ट की प्रतिलिपि।
- उस ऑब्जेक्ट के प्रकार के बाद से कोई वर्चुअल-टेबल संकलित समय पर ज्ञात नहीं है।
- फ़ंक्शन का पता संकलन समय पर जाना जाता है।
- 0 संकेतक हैं; संभव inlining।
सी ++ टेम्पलेट्स पर्याप्त बहुमुखी ऊपर अन्य दो शैलियों अनुमति देने के लिए हैं, और वे भी मात कर सकते हैं इनलाइन करने के मामले ... में
संकलित कार्यात्मक भाषाओं: (छोड़कर JVM और जावास्क्रिप्ट लक्ष्य प्लेटफॉर्म के रूप में "उचित पूंछ कॉल" गायब होने के कारण)
- फ़ंक्शन पॉइंटर और मशीन रजिस्टरों में इसके बंद होने का संदर्भ।
- आमतौर पर यह कोई फ़ंक्शन "कॉल" नहीं होता है लेकिन कूद की तरह एक गोटो है।
- कार्यों को स्टैक की आवश्यकता नहीं है, वापस कूदने के लिए कोई पता नहीं, कोई पैरामीटर नहीं है और न ही स्टैक पर स्थानीय चर हैं।
- फ़ंक्शंस में उनके कचरे को संग्रहित बंद करने के लिए पैरामीटर होते हैं और अगले फ़ंक्शन को पॉइंटर कहा जाता है।
- सीपीयू के लिए कूदने की भविष्यवाणी करने के लिए, फ़ंक्शन का पता जितनी जल्दी हो सके रजिस्टर में लोड किया जाना चाहिए।
- यह संभव कूद पूर्वानुमान के साथ 1 संकेत है; सबकुछ जितना तेज़ है उतना तेज़ है।
[सी ++ फ़ैक्टर - और उनके उपयोग] के संभावित डुप्लिकेट (http://stackoverflow.com/questions/356950/c-functors-and-their-uses)। –