2012-12-19 22 views
7

मेरे पास एक विस्तारित छवि प्रसंस्करण प्रोजेक्ट है जो इसकी अधिकांश कार्यक्षमता के लिए ओपनसीवी लाइब्रेरी पर भारी निर्भर करता है, हालांकि मैं कुछ बूस्ट फ़ंक्शंस का भी उपयोग करता हूं।ओपनसीवी या बूस्ट स्मार्ट पॉइंटर्स

मैं कुछ कच्चे पॉइंटर्स को बदलने के लिए स्मार्ट पॉइंटर्स का उपयोग शुरू करना चाहता हूं जो समस्याएं पैदा कर रहे हैं। मेरा सवाल यह है कि किस प्रकार का स्मार्ट पॉइंटर उपयोग करना है, मेरे मुख्य विकल्प (मुझे लगता है) ओपनसीवी cv::Ptr या बूस्ट वेरिएंट्स में से एक है।

मुझे पता है वहाँ questions बढ़ावा संकेत में से प्रत्येक के बीच विभिन्न समझाने का एक number हैं, लेकिन मैं आशा व्यक्त की कि किसी कैसे cv::Ptr उन लोगों के साथ तुलना की एक विवरण प्रदान करते हैं और एक या दूसरे के किसी भी सुझाव दे सकते हैं सकता है?

संपादित करें - मैंने OpenCV docs से देखा है कि Ptrshared_ptr को बढ़ावा देने के समान है, क्या आवश्यक अंतर है जिसमें लाइब्रेरी/फ़ाइलें शामिल हैं?

+3

क्या आपने मानक स्मार्ट पॉइंटर्स का उपयोग करने पर विचार किया है (यदि आपके पास सी ++ 11 तक पहुंच है)? यदि आप C++ 11 का उपयोग कर रहे हैं तो – undu

+0

+1 'std :: shared_ptr' पर +1। अन्यथा यह वास्तव में नीचे आता है कि आप पहले से ही बूस्ट का उपयोग कर रहे हैं या बढ़ावा देने के लिए योजना बना रहे हैं, या बढ़ावा देने के साथ चीजों के साथ अंतःक्रिया कर रहे हैं। मुझे नहीं लगता कि यह 'shared_ptr' के लिए केवल बढ़ावा देने के लायक है, क्योंकि' cv :: Ptr' काफी अच्छी तरह से काम करता है। – yiding

+2

जो आप उपयोग करते हैं, वह आपके द्वारा कॉल किए जा रहे एपीआई पर निर्भर करेगा - स्मार्ट पॉइंटर के इन 3 स्वाद आवश्यक रूप से अदला-बदले नहीं हैं, या रूपांतरण ऑपरेटरों को स्वयं के बीच प्रदान नहीं करते हैं। इस कारण से, बूस्ट लाइब्रेरी के अन्य हिस्सों का उपयोग करते समय 'std :: shared_ptr' के बजाय 'boost :: shared_ptr' कार्यान्वयन का उपयोग करने के अक्सर अच्छे कारण होते हैं। ओपनसीवी के लिए भी यही संभावना है। – marko

उत्तर

7

ओपनसीवी दस्तावेज में जो कुछ भी मैं देख सकता हूं, यह एक संदर्भ-गणना स्मार्ट सूचक है, अनिवार्य रूप से, boost::shared_ptr जैसा ही है। यहां तक ​​कि यह संदर्भ गणना पर परमाणु संचालन का उपयोग करता है।

मैं पोर्टेबिलिटी और इंटरऑपरेबिलिटी के आधार पर पसंद करूंगा।

  1. आपके सिस्टम जा रहा है कहीं और भेजा जा करने के लिए और यह सुनिश्चित करें के लिए OpenCV पर निर्भर करता है लेकिन boost पर नहीं? फिर, यदि आप बूस्ट से बच सकते हैं और आप निर्भरता से छुटकारा पा सकते हैं तो OpenCV cv::Ptr पर चिपके रहें।

  2. क्या boost::shared_ptr बाकी ओपनसीवी के साथ अच्छा खेलता है? यदि आपके पास ओपनसीवी लाइब्रेरी से सीवी :: पीआरटी लौटने वाला कुछ है, तो शायद इन मामलों में सीवी :: पीआरटी से चिपकना बेहतर होगा, क्योंकि यदि आप दोनों प्रकार के पॉइंटर्स को मिक्स करते हैं तो संदर्भ गणना गलत तरीके से संभाली जाएगी और संसाधन नष्ट हो सकता है समय से पहले ही।

  3. आप जहां भी प्रोजेक्ट बंद करते हैं boost पर चिपकने जा रहे हैं? फिर, boost::shared_ptr पर चिपके रहें जब आप इसे कर सकें, यह अधिक मानक है, लोग इसे जानते हैं और तुरंत आपके कोड को समझेंगे। अद्यतन: सी ++ में आपके पास std :: shared_ptr है, जो कि आप इसे बर्दाश्त कर सकते हैं, पर निर्भरता नहीं है, इसलिए आप इस मामले में std :: shared_ptr का उपयोग कर सकते हैं और बूस्ट से भी छुटकारा पा सकते हैं।

बस एक पक्ष नोट के रूप में, वहाँ बढ़ावा मिश्रण और साझा संकेत दिए गए कि संदर्भ सही ढंग से चारों ओर रख सकते हैं और किसी के लिए उपयोगी हो सकता है std करने के लिए एक तकनीक है। यह प्रश्न देखें, यह अन्य प्रकार के संदर्भ-गिनती पॉइंटर्स को मिश्रित करने के लिए भी प्रासंगिक हो सकता है: Conversion from boost::shared_ptr to std::shared_ptr?

मेरे अनुभव में, जब आप कुछ पोर्ट करते हैं, कम निर्भरता, बेहतर, या ऐसे कुछ प्लेटफ़ॉर्म होते हैं जिनके लिए संकलन हो सकता है नरक। तो पोर्टेबिलिटी के आधार पर अपनी पसंद करें अगर यह पुस्तकालयों के साथ पॉइंटर्स की चिंता और अंतःक्रियाशीलता है।

+2

भावी पाठकों के लिए: इस उत्तर का एक हिस्सा शायद सी ++ 11 में 'std :: shared_ptr' के परिचय से अप्रचलित हो गया है: यदि आप इसे' boost :: shared_ptr' के बजाय उपयोग करते हैं, तो तीसरा बिंदु किसी भी लागू नहीं होता है अधिक। लेकिन बाकी का जवाब अभी भी मान्य है! – anderas

+0

मैंने सी ++ 11 में std :: shared_ptr को प्रतिबिंबित करने और संदर्भ संख्याओं को मिश्रित करने के लिए प्रश्न अपडेट किया। –

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