2011-11-19 16 views
13

सामान्य एकीकरण कार्यों की तुलना करें द्वारा मूल्य द्वारा functor वस्तु पासिंग बनाम ? एसटीएल पहले दृष्टिकोण (मूल्य से गुजरता है) का उपयोग करता है, क्या इसका मतलब यह सबसे सार्वभौमिक है?संदर्भ (C++)

+0

एसटीएल आमतौर पर पहले दृष्टिकोण का उपयोग करता है क्योंकि जब आप संदर्भों के कंटेनरों का उपयोग करते हैं तो कई समस्याएं उत्पन्न होती हैं। –

+2

हर जगह के समान ही: 'एफ' क्या है, इस संस्करण के आधार पर, ये संस्करण समान रूप से अलग होने से हो सकते हैं। यदि 'एफ' राज्यपूर्ण है, तो केवल मध्यम संस्करण संभव हो सकता है। –

+0

असल में, आप अपने उपयोगकर्ताओं पर जो भी फॉर्म चुनते हैं, उसमें आवश्यकताएं डाल रहे हैं। यदि मूल्य के अनुसार, आपको यह आवश्यक है कि वे आपको एक मज़ेदार दें जो ईमानदारी खोने के लिए प्रतिलिपि बनाई जा सकती है। यदि संदर्भ के अनुसार, तो आपको यह आवश्यक है कि वे आपको जो कुछ भी उपयोगकर्ता डाल रहे हैं, उसके लिए आपको जीवन भर के साथ कुछ दे। – Mordachai

उत्तर

19

फ़ंक्शन ऑब्जेक्ट्स आमतौर पर छोटे होने चाहिए इसलिए मुझे नहीं लगता कि उन्हें मूल्य से गुजरना निष्पक्ष प्रदर्शन से पीड़ित होगा (कार्य को उसके शरीर में कार्य करने के लिए तुलना करें)। यदि आप मूल्य से गुजरते हैं, तो आप कोड विश्लेषण से भी लाभ प्राप्त कर सकते हैं, क्योंकि एक मान पैरामीटर फ़ंक्शन के लिए स्थानीय है और ऑप्टिमाइज़र बता सकता है कि मज़ेदार के डेटा सदस्य से लोड कब और कब नहीं छोड़ा जा सकता है।

यदि मज़ेदार स्टेटलेस है, तो इसे तर्क के रूप में पास करने का कोई मतलब नहीं है - पैडिंग बाइट जिसे मज़ेदार लेता है, उसके पास कोई विशेष मूल्य नहीं है (कम से कम जीसीसी द्वारा उपयोग किए जाने वाले इटेनियम अबी में)। संदर्भों का उपयोग करते समय, आपको हमेशा एक पता पारित करना होगा।

पिछले एक (const T&) दोष बीमार का गठन कि सी ++ 03 कि क्योंकि सी ++ 03 कार्यक्रम में कच्चे कार्यों के लिए काम नहीं करता है, है में यदि आप एक समारोह प्रकार के const लागू करने का प्रयास किया है (और एक SFINAE मामला है)। फ़ंक्शन प्रकारों पर लागू होने पर अधिक हालिया कार्यान्वयन const को अनदेखा करते हैं।

दूसरा एक (T&) में स्पष्ट कमी है कि आप अस्थायी फ़ैक्टर नहीं पारित कर सकते हैं।

लंबी कहानी छोटी, मैं आमतौर पर उन्हें मूल्य से पास कर दूंगा, जब तक कि मुझे ठोस मामलों में स्पष्ट लाभ दिखाई न दे।

3

संदर्भ को देखते हुए, एफ एक "प्रतिदेय वस्तु" (एक नि: शुल्क समारोह या एक वर्ग एक ऑपरेटर() परिभाषित होने की तरह कुछ) होने की उम्मीद है

अब, के बाद से एक नि: शुल्क समारोह नाम एक एल नहीं किया जा सकता मूल्य, दूसरा संस्करण इसके लिए उपयुक्त नहीं है। तीसरा मानता है कि एफ :: ऑपरेटर() को कॉन्स होना चाहिए (लेकिन यह मामला नहीं हो सकता है, अगर इसे एफ की स्थिति में परिवर्तन करने की आवश्यकता है) पहला "अपनी प्रतिलिपि" पर चलता है, लेकिन एफ को प्रतिलिपि बनाने की आवश्यकता होती है।

तीनों में से कोई भी "सार्वभौमिक" नहीं है, लेकिन सबसे आम तौर पर सबसे आम मामलों में काम कर रहा है।

5

एसटीएल पहले दृष्टिकोण (मूल्य से गुजरती हैं)

ज़रूर, मानक पुस्तकालयों मूल्य द्वारा iterators functors के पारित उपयोग करता है। उन्हें प्रतिलिपि बनाने के लिए सस्ता होने के लिए (सही या गलत तरीके से) माना जाता है, और इसका मतलब यह है कि यदि आप प्रतिलिपि बनाने वाले महंगे या मज़ेदार को लिखते हैं, तो आपको बाद में अनुकूलित करने का एक तरीका मिलना पड़ सकता है।

लेकिन यह केवल उन प्रयोजनों के लिए है जिनके लिए मानक पुस्तकालयों में मकान मालिकों का उपयोग होता है - ज्यादातर वे भविष्यवाणी करते हैं, हालांकि std::transform जैसी चीजें भी हैं। यदि आप किसी फ़ंक्शन को एकीकृत कर रहे हैं, जो किसी प्रकार के गणित पुस्तकालयों का सुझाव देता है, तो मुझे लगता है कि आपको लगता है कि आप बहुत सारे राज्यों वाले कार्यों से निपटने की अधिक संभावना रखते हैं। उदाहरण के लिए आप एन-ऑर्डर गुणांक के रूप में एन + 1 गुणांक के साथ, एनएच ऑर्डर बहुपदों का प्रतिनिधित्व करने वाली कक्षा कर सकते हैं।

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

गैर-कॉन्स्ट संदर्भ लेना उपयोगकर्ताओं के लिए संभावित रूप से परेशान है, क्योंकि इससे उन्हें अस्थायी रूप से गुजरना बंद हो जाता है।