"यदि कोई कर्मचारी अपना काम अच्छी तरह से करना चाहता है, तो उसे पहले अपने औजारों को तेज करना होगा।" - कन्फ्यूशियस, "द एनालेक्ट्स ऑफ कन्फ्यूशियस। लू लिंगगोंग"
मुखपृष्ठ > प्रोग्रामिंग > std::move बनाम std::forward: आपको Rvalue हैंडलिंग के लिए प्रत्येक का उपयोग कब करना चाहिए?

std::move बनाम std::forward: आपको Rvalue हैंडलिंग के लिए प्रत्येक का उपयोग कब करना चाहिए?

2024-12-21 को प्रकाशित
ब्राउज़ करें:305

std::move vs. std::forward: When Should You Use Each for Rvalue Handling?

std::move बनाम std::forward: Rvalue हैंडलिंग के लिए विशिष्टता का अनावरण

C में मूव सिमेंटिक्स के आगमन की शुरुआत हुई है प्रतिद्वंद्विता संदर्भों में हेरफेर और स्थानांतरण के लिए दो महत्वपूर्ण कार्य: std::move और std::forward। जबकि दोनों एक ऑब्जेक्ट को संदर्भ प्रकार में डालते हैं, वे अपने विशिष्ट व्यवहार और उपयोग के मामलों में भिन्न होते हैं।

std::move: एक Rvalue संदर्भ में कास्टिंग

std:: move एक ऑब्जेक्ट लेता है और इसे एक प्रतिद्वंद्विता संदर्भ में परिवर्तित करता है। यह महत्वपूर्ण है क्योंकि एक प्रतिद्वंद्विता संदर्भ आम तौर पर यह दर्शाता है कि संदर्भित वस्तु को उपभोग के बाद अस्थायी और संभावित रूप से अमान्य माना जा सकता है। संक्षेप में, std::move आपको यह संकेत देने की अनुमति देता है कि आप किसी ऑब्जेक्ट को उसके वर्तमान स्थान से "स्थानांतरित" करने का इरादा रखते हैं, संभावित रूप से उस पर मौजूद अंतर्निहित मेमोरी को मुक्त कर देते हैं।

std::forward: परफेक्ट फ़ॉरवर्डिंग दूसरी ओर, Rvalue References

std::forward, एक विशिष्ट उद्देश्य को पूरा करता है: यह सुनिश्चित करता है कि एक फ़ंक्शन संदर्भ प्रकार को आगे बढ़ाता है कॉल करने वाले को तर्क. यह "संपूर्ण अग्रेषण" को सक्षम बनाता है, जिसका अर्थ है कि किसी फ़ंक्शन को दिए गए प्रतिद्वंद्विता तर्क उस फ़ंक्शन के भीतर प्रतिद्वंद्विता के रूप में माने जाते रहेंगे। इन अस्थायी मूल्यों के इच्छित शब्दार्थ को संरक्षित करने के लिए यह महत्वपूर्ण है। और वांछित परिणाम:

जब आपका इरादा हो तो std::move

का उपयोग करें किसी ऑब्जेक्ट को स्थानांतरित करें, यह दर्शाता है कि इसका मूल्य बाद में उपयोग नहीं किया जाएगा और आप संभावित रूप से इसकी मेमोरी को पुनः प्राप्त करना चाहते हैं।

    जब आपको किसी तर्क के संदर्भ प्रकार को संरक्षित करने की आवश्यकता हो तो std::forward
  • का उपयोग करें एक फ़ंक्शन के भीतर, फ़ंक्शन को दिए गए प्रतिद्वंद्विता संदर्भों को इस तरह बनाए रखने की अनुमति देता है।
  • अंतर को स्पष्ट करने के लिए, निम्नलिखित पर विचार करें उदाहरण:
  • void Overload(int const& arg) { std::cout शून्य अग्रेषण(t&& ​​arg) { std::cout (arg)); std::cout
  • रिवैल्यू के साथ फॉरवर्डिंग(5) को कॉल करते समय, आउटपुट होता है:

std::forward के माध्यम से: rvalue द्वारा std::move के माध्यम से: rvalue द्वारा साधारण पासिंग द्वारा: rvalue द्वारा

void overload(int const& arg) { std::cout 
void forwarding(t&& arg) {
    std::cout (arg));
    std::cout 

इसके विपरीत , फ़ॉर्वर्डिंग (x) को लैवल्यू (x = 5) के साथ कॉल करने से:

via std::forward: by rvalue
via std::move: by rvalue
by simple passing: by rvalue

यहां, std::forward और std::move दोनों ने अपनी विशिष्ट भूमिकाओं को उजागर करते हुए, lvalue को एक rvalue संदर्भ में डाल दिया।

नवीनतम ट्यूटोरियल अधिक>

चीनी भाषा का अध्ययन करें

अस्वीकरण: उपलब्ध कराए गए सभी संसाधन आंशिक रूप से इंटरनेट से हैं। यदि आपके कॉपीराइट या अन्य अधिकारों और हितों का कोई उल्लंघन होता है, तो कृपया विस्तृत कारण बताएं और कॉपीराइट या अधिकारों और हितों का प्रमाण प्रदान करें और फिर इसे ईमेल पर भेजें: [email protected] हम इसे आपके लिए यथाशीघ्र संभालेंगे।

Copyright© 2022 湘ICP备2022001581号-3