यदि आप प्रदर्शन चाहते हैं, तो यदि आप इसे संग्रहीत कर रहे हैं, तो मूल्य से गुजरें।
मान लीजिए कि आपके पास एक फ़ंक्शन है जिसे "UI थ्रेड में चलाएं"।
std::future<void> run_in_ui_thread( std::function<void()> )
जो "ui" धागे में कुछ कोड चलाता है, तब किए जाने पर संकेत देता futureहै। (यूआई फ्रेमवर्क में उपयोगी है जहां यूआई धागा वह है जहां आप यूआई तत्वों के साथ गड़बड़ करने वाले हैं)
हमारे पास दो हस्ताक्षर हैं जिन पर हम विचार कर रहे हैं:
std::future<void> run_in_ui_thread( std::function<void()> ) // (A)
std::future<void> run_in_ui_thread( std::function<void()> const& ) // (B)
अब, हम निम्नानुसार इनका उपयोग करने की संभावना रखते हैं:
run_in_ui_thread( [=]{
// code goes here
} ).wait();
जो एक अनाम क्लोजर (एक लैम्ब्डा) बनाएगा, std::functionउसमें से एक का निर्माण करेगा, इसे run_in_ui_threadफंक्शन में पास करेगा , फिर मुख्य धागे में रनिंग खत्म होने का इंतजार करेगा।
मामले में (ए), std::functionसीधे हमारे मेमने से बनाया गया है, जो तब उपयोग किया जाता है run_in_ui_thread। लैम्ब्डा में moveघ है std::function, इसलिए किसी भी चल राज्य को कुशलता से इसमें ले जाया जाता है।
दूसरे मामले में, एक अस्थायी std::functionबनाया जाता है, लैम्ब्डा को इसमें moveघ में रखा जाता है, फिर उस अस्थायी std::functionका उपयोग के भीतर संदर्भ द्वारा किया जाता है run_in_ui_thread।
अब तक, बहुत अच्छा - उनमें से दो पहचान के रूप में प्रदर्शन करते हैं। सिवाय run_in_ui_threadइसके समारोह तर्क की एक प्रति बनाने के लिए ui थ्रेड को निष्पादित करने के लिए भेजने के लिए जा रहा है! (इससे पहले कि यह इसके साथ किया जाता है, वापस आ जाएगा, इसलिए यह सिर्फ एक संदर्भ का उपयोग नहीं कर सकता है)। मामले (ए) के लिए, हम बस अपनी लंबी अवधि के भंडारण में। मामले में (बी), हम नकल करने के लिए मजबूर हैं ।movestd::functionstd::function
वह दुकान मूल्य से अधिक इष्टतम होकर गुजरती है। यदि कोई संभावना है कि आप की एक प्रति संग्रहीत कर रहे हैं std::function, तो मूल्य से पास करें। अन्यथा, किसी भी तरह से लगभग बराबर है: यदि आप एक ही भारी ले जा रहे हैं std::functionऔर एक के बाद एक उप विधि का उपयोग कर रहे हैं तो उप -मूल्य के लिए केवल नकारात्मक है। यह कहते हुए कि, एक के moveरूप में कुशल हो जाएगा const&।
अब, दोनों के बीच कुछ अन्य अंतर हैं जो ज्यादातर किक करते हैं यदि हमारे पास लगातार स्थिति है std::function।
मान लें कि std::functionस्टोर कुछ ऑब्जेक्ट के साथ है operator() const, लेकिन इसमें कुछ mutableडेटा सदस्य भी हैं जो इसे संशोधित करता है (कैसे अशिष्ट!)।
में std::function<> const&मामला है, mutableसंशोधित डेटा सदस्यों समारोह कॉल से बाहर का प्रचार करेंगे। में std::function<>मामला है, वे नहीं होगा।
यह एक अपेक्षाकृत अजीब कोने का मामला है।
आप चाहते हैं std::functionकि आप किसी अन्य के साथ संभवतः भारी वजन, सस्ते चल प्रकार का इलाज करें। चलना सस्ता है, नकल करना महंगा हो सकता है।
sizeof(std::function)है कि इससे अधिक नहीं होगा2 * sizeof(size_t), जो कि कम से कम आकार है जिसे आप कभी भी एक संदर्भ के लिए विचार करेंगे।