2014-10-15 12 views
7

में फ़ंक्शन पॉइंटर्स का उपयोग करना फ़ंक्शन पॉइंटर्स का मुख्य कारण जेनेरिक कॉल करने योग्य ऑब्जेक्ट्स प्रदान करना है, लेकिन सी ++ 11 में इसे प्रदान करने का तरीका std::function का उपयोग करना होगा, तो क्या आधुनिक सी ++ में फ़ंक्शन पॉइंटर्स का उपयोग करने का कोई कारण है सी के साथ संगतता से? दूसरे शब्दों में, std::function फ़ंक्शन पॉइंटर्स का एक आधुनिक संस्करण है, ठीक उसी तरह std::array बनाम अंतर्निहित सरणी?सी ++ 11

+1

आपने फ़ंक्शन पॉइंटर्स जेनेरिक कॉल करने योग्य ऑब्जेक्ट्स क्यों कहा? – Jamboree

+0

मेरा मतलब था कि आप एक ही हस्ताक्षर के साथ एक फ़ंक्शन पॉइंटर –

+1

पर विभिन्न कार्यों को असाइन कर सकते हैं। दक्षता विचार हो सकते हैं। 'std :: functions' में अतिरिक्त संकेत हैं और वे निःशुल्क नहीं हैं। – juanchopanza

उत्तर

3

हाँ मैं लगभग हर जगह std::function पसंद करूंगा लेकिन कुछ ऐसे मामले हैं जहां आकार ओवरहेड और std::function का संकेत स्वीकार्य नहीं हो सकता है। std::function में लिपटे फ़ंक्शन पॉइंटर्स जैसे छोटे कॉलबेल के लिए, आमतौर पर कोई अतिरिक्त संकेत नहीं होता है और कोई गतिशील स्मृति आवंटन नहीं होता है क्योंकि कॉल करने योग्य std::function में फिट बैठता है लेकिन std::function बड़े कॉलबेल को पकड़ने के लिए बड़ा हो सकता है, इसलिए वहां एक बड़ा स्थान ओवरहेड हो सकता है।

+0

आप केवल lambda अभिव्यक्तियों के बजाय 'std :: function' का उपयोग कब करेंगे? जब आप अन्य प्रकार के कार्यान्वयन प्रदान करने में सक्षम होना चाहते हैं और आप उन्हें लैम्ब्डा में लपेटकर ऐसा नहीं करना चाहते हैं? – Jerry101

+0

@ Jerry101 हां फ़ंक्शन पॉइंटर्स की तरह मैं उन्हें विभिन्न कार्यान्वयन के बीच स्विच करने के लिए उपयोग करता हूं या कॉलर को कॉलबैक जैसी किसी प्रकार की कार्यक्षमता प्रदान करने देता हूं। आप इसे लैम्बडास के साथ नहीं कर सकते क्योंकि प्रत्येक लैम्ब्डा का अपना प्रकार होता है। – TNA

+1

std :: function का मुख्य उद्देश्य टाइप एरर और अनुकूलन है। फंक्शन पॉइंटर्स का सख्त प्रकार होता है। std :: function एक polymorphic फ़ंक्शन रैपर है, यह एक नि: शुल्क फ़ंक्शन, क्लास स्टैटिक फ़ंक्शन, एक सदस्य फ़ंक्शन से जुड़ सकता है, और इसका आंशिक फ़ंक्शन एप्लिकेशन आदि के लिए उपयोग किया जा सकता है। यदि आपको इसकी आवश्यकता नहीं है, तो शायद नौकरी के लिए सही उपकरण नहीं है, टाइप-एरर मुक्त नहीं होता है, अक्सर वर्चुअल कॉल और ढेर आवंटन शामिल होता है (हालांकि आम तौर पर एक छोटा बफर ऑप्टिमाइज़ेशन होता है)। – BenPope

2

ईमानदार होने के लिए, मैं ऐसे मामले के बारे में नहीं सोच सकता जहां मुझे std :: function की आवश्यकता होगी, और यही कारण है कि। अगर मैं बिल्कुल फ़ंक्शन पॉइंटर्स को उछाल रहा हूं, तो शायद मैं बहुत कम स्तर पर काम कर रहा हूं। शायद कारण यह है कि सी ++ - शैली विरासत बहुत ही सीमित साबित हुई है इसलिए मैं अपना खुद का बहुरूपता डिजाइन कर रहा हूं। वैकल्पिक रूप से, मैं एक छोटे से एम्बेडेड नियंत्रक पर काम कर रहा हूं जहां मैं वास्तव में बाइट्स को शेविंग कर रहा हूं। किसी भी तरह से, मैं खुद पर भरोसा करूँगा, संकलक पर नहीं, यह याद रखने के लिए कि मुझे किस तरह के आदि मिलते हैं। मैं मूल रूप से धातु को टक्कर लगी होगी और धातु को धातु की तरह व्यवहार करना चाहूंगा, सिरिअस साइबरनेटिक्स से लिफ्ट की तरह नहीं ।

एकमात्र मामला जहां मुझे std :: फ़ंक्शन का ओवरहेड चाहिए, यह है कि अगर मैं कुछ कार्यात्मक करने की कोशिश कर रहा हूं, जैसे कि जॉगलिंग क्लोजर, लेकिन यदि मैं चाहता हूं तो मुझे C++ का उपयोग करने की संभावना नहीं है बिलकुल।

+0

जावा स्क्रिप्ट बंद करने और फ़ंक्शन पॉइंटर्स के अलावा कुछ भी नहीं है। मैं उस प्रोग्रामिंग शैली को "निम्न स्तर" नहीं कहूंगा। :) कार्यात्मक प्रोग्रामिंग के तत्व संभावित रूप से उपयोगी हैं इस पर ध्यान दिए बिना कि आप अपने स्तर को कितना कम पाते हैं। – Eugene

+0

* कुछ भी * एक घटना आधारित प्रणाली के समान दूरस्थ रूप से सादे फ़ंक्शन पॉइंटर्स की बजाय 'std :: function' के साथ बेहतर होगा। 'शून्य *' पैरामीटर और कास्टिंग में पास करना आमतौर पर पसंद नहीं किया जाता है: पी – CoffeeandCode

1

पॉज़िक्स सिस्टम पर आपको dlopen & dlsym मिलता है और आप गतिशील रूप से लोड किए गए प्लगइन से फ़ंक्शन पॉइंटर्स प्राप्त करने के लिए उनका उपयोग करेंगे।

यह एक आम उपयोग के मामले जहां समारोह संकेत अभी भी उपयोगी होते हैं, यहां तक ​​कि सी ++ 14 के साथ है (देखें उदाहरण के लिए Qt)

और के रूप में कई लोगों को देखा, बंद के कार्यान्वयन (या std::function का) अक्सर की आवश्यकता होगी अतिरिक्त संकेत और अतिरिक्त रनटाइम लागत।

1

std::function अधिकतर उपयोग मामलों के लिए बहुत ही आसान और कुशल है। लेकिन एक गायब विशेषता है: समानता।

तो, जब भी आपको ऑब्जेक्ट की तरह std::function की तुलना/फ़िल्टर/खोज/सॉर्ट करने की आवश्यकता होती है, तो आपको अपनी आवश्यकता को लागू करने के लिए फ़ंक्शन पॉइंटर्स पर वापस आना होगा।

+0

फ़ंक्शन की समानता किसी भी तरह से अपरिहार्य है, अगर आप उनके अवलोकन योग्य व्यवहार की देखभाल करते हैं तो केवल –

+0

निश्चित रूप से, यही कारण है कि 'std :: function' ऑब्जेक्ट्स की तुलना नहीं की जा सकती है) – Stas