यदि आप प्रदर्शन चाहते हैं, तो यदि आप इसे संग्रहीत कर रहे हैं, तो मूल्य से गुजरें।
मान लीजिए कि आपके पास एक फ़ंक्शन है जिसे "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 थ्रेड को निष्पादित करने के लिए भेजने के लिए जा रहा है! (इससे पहले कि यह इसके साथ किया जाता है, वापस आ जाएगा, इसलिए यह सिर्फ एक संदर्भ का उपयोग नहीं कर सकता है)। मामले (ए) के लिए, हम बस अपनी लंबी अवधि के भंडारण में। मामले में (बी), हम नकल करने के लिए मजबूर हैं ।move
std::function
std::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)
, जो कि कम से कम आकार है जिसे आप कभी भी एक संदर्भ के लिए विचार करेंगे।