1. "यह क्या है?"
जबकि std::move()
तकनीकी रूप से एक फ़ंक्शन है - मैं कहूंगा कि यह वास्तव में एक फ़ंक्शन नहीं है । यह एक तरह का है कनवर्टर तरीके के बीच संकलक एक अभिव्यक्ति के मूल्य को समझता है।
2. "यह क्या करता है?"
ध्यान देने वाली पहली बात यह है कि std::move()
वास्तव में कुछ भी स्थानांतरित नहीं होता है । यह एक अभिव्यक्ति को एक लवल्यू (जैसे नामांकित चर) से एक ज्वलंत होने के रूप में परिवर्तित करता है । एक xvalue संकलक को बताता है:
आप मुझे लूट सकते हैं, मैं जो कुछ भी पकड़ रहा हूं उसे कहीं और स्थानांतरित कर सकता हूं (चूंकि मैं जल्द ही नष्ट होने वाला हूं)।
दूसरे शब्दों में, जब आप उपयोग करते हैं std::move(x)
, तो आप संकलक को नरभक्षण की अनुमति दे रहे हैं x
। इस प्रकार यदि x
स्मृति में इसका अपना बफर है, तो कहिए - std::move()
संकलक के बाद संकलक के बदले कोई अन्य वस्तु हो सकती है।
आप एक प्रचलन से भी आगे बढ़ सकते हैं (जैसे कि एक अस्थायी जो आप चारों ओर से गुजर रहे हैं), लेकिन यह शायद ही कभी उपयोगी होता है।
3. "इसका उपयोग कब किया जाना चाहिए?"
इस सवाल को पूछने का एक और तरीका है, "मैं किसी मौजूदा ऑब्जेक्ट के संसाधनों के लिए क्या नरभक्षण कर सकता हूं?" ठीक है, यदि आप एप्लिकेशन कोड लिख रहे हैं, तो आप शायद संकलक द्वारा बनाई गई अस्थायी वस्तुओं के साथ बहुत गड़बड़ नहीं करेंगे। इसलिए मुख्य रूप से आप इसका निर्माण कंस्ट्रक्टर, ऑपरेटर के तरीके, मानक-पुस्तकालय-एल्गोरिथ्म जैसे कार्यों आदि में करते हैं, जहाँ ऑब्जेक्ट्स निर्मित होते हैं और स्वचालित रूप से बहुत नष्ट हो जाते हैं। बेशक, यह सिर्फ एक नियम है।
एक विशिष्ट उपयोग संसाधनों को कॉपी करने के बजाय एक वस्तु से दूसरी वस्तु तक ले जाना है। @ गिलुयूम इस पृष्ठ से जुड़ता है जिसका एक सीधा छोटा उदाहरण है: कम नकल वाले दो वस्तुओं की अदला- बदली ।
template <class T>
swap(T& a, T& b) {
T tmp(a); // we now have two copies of a
a = b; // we now have two copies of b (+ discarded a copy of a)
b = tmp; // we now have two copies of tmp (+ discarded a copy of b)
}
चाल का उपयोग करने से आप संसाधनों को चारों ओर नकल करने के बजाय स्वैप कर सकते हैं:
template <class T>
swap(T& a, T& b) {
T tmp(std::move(a));
a = std::move(b);
b = std::move(tmp);
}
सोचें कि क्या होता है जब T
, कहते हैं, vector<int>
आकार एन। पहले संस्करण में आप 3 * n तत्वों को पढ़ते हैं और लिखते हैं, दूसरे संस्करण में आप मूल रूप से वैक्टर के बफ़र्स को केवल 3 पॉइंटर्स पढ़ते हैं और लिखते हैं, साथ ही 3 बफ़र्स आकार। बेशक, कक्षा T
को यह जानने की ज़रूरत है कि चलती कैसे करें; आपकी कक्षा में कार्य करने के लिए एक चाल-असाइनमेंट ऑपरेटर और कक्षा के T
लिए एक चाल-निर्माणकर्ता होना चाहिए ।