संभव डुप्लिकेट:
What is the difference between r-value references and l-value references? (CodeGen)सी ++: तकनीकी स्तर (एएसएम) पर आर-वैल्यू संदर्भ क्या हैं?
मैं सोच रहा था, किसी को समझा सकते हैं क्या आर-मूल्य संदर्भ एक तकनीकी स्तर पर कर रहे हैं? इसका मतलब है: आर-वैल्यू संदर्भ बनाए जाने पर असेंबलर स्तर पर क्या होता है।
एक छोटे से परीक्षण को देखने के लिए के लिए क्या होता है अंदर मैं निम्नलिखित कोड लिखा है:
char c = 255;
char &c2 = c;
char &c3 = std::move(c);
मैं जानता हूँ कि यह कोई मतलब नहीं है 'सी' के लिए एक आर-मूल्य संदर्भ बनाने के लिए, लेकिन सिर्फ की खातिर परीक्षण मैंने वैसे भी किया, यह देखने के लिए कि यह क्या करता है। और यहाँ परिणाम है:
unsigned char c = 255;
mov byte ptr [c],0FFh
unsigned char &c2 = c;
lea eax,[c]
mov dword ptr [c2],eax
unsigned char &&c3 = std::move(c);
lea eax,[c]
push eax
call std::move<unsigned char &> (0ED1235h)
add esp,4
mov dword ptr [c3],eax
मैं अब तक कोई एएसएम विशेषज्ञ द्वारा हूँ, लेकिन यह मेरे लिए लग रहा है कि, इस मामले में, 'सी 3' अंत में 'सी' के लिए एक नियमित संदर्भ है।
अगर मैं एक अस्थायी (चार & & सी 3 = 255), जैसे कोडांतरक परिवर्तन के अंतिम बिट के लिए सीधे आर-मूल्य संदर्भ बाँध:
unsigned char &&c3 = 255;
mov byte ptr [ebp-29h],0FFh
lea eax,[ebp-29h]
mov dword ptr [c3],eax
इस परिवर्तन के दिखता से, मुझे लगता है कि सी 3 अभी भी वास्तव में कुछ स्मृति स्थान का संदर्भ है जिसमें मूल्य 255 है। तो यह एक नियमित संदर्भ है - मान को कॉपी नहीं किया गया है/c3 को असाइन किया गया है। क्या ये सच है?
क्या कोई कह सकता है कि मेरी धारणाएं सही हैं या यदि मैं पूरी तरह से ट्रैक से बाहर हूं? जब तक संकल्प को कॉल करने की बात आती है, तब तक मैंने हमेशा आर-वैल्यू संदर्भों को एक फ़ंक्शन/विधियों के हस्ताक्षर (संभावित रूप से एक चाल-सीटीआर) से मेल खाने के बारे में सोचा था, ताकि कोडर जानता है कि प्रदान किए गए डेटा का इलाज कैसे करें (एक चाल-सीटीआर के लिए जो इसे कॉपी करने के बजाय डेटा ले जायेगा)।
इस बदसूरत प्रयास की रक्षा करने के लिए मैंने अभी प्रस्तुत किया है: मैं अपने कोड के साथ एएसएम स्तर पर घूमने का इरादा नहीं रखता हूं, मैं केवल यह समझना चाहता हूं कि आर-वैल्यू संदर्भों के आसपास के बाकी हिस्सों की तुलना में तकनीकी अंतर क्या है इन सभी वर्षों।
कोई अंतर्दृष्टि और स्पष्टीकरण स्वागत से अधिक हैं!
धन्यवाद!
(unoptimized) विधानसभा स्तर पर, एक आर-मूल्य सिर्फ एक एल मूल्य, संदर्भ, या "मूल्य" की तरह, एक वस्तु का एक उदाहरण है। आर-वैल्यू बस _compiler_ को बताता है जो कॉपी/निर्माण के लिए उपयोग करने के लिए काम करता है। यह किसी ऑब्जेक्ट या पैरामीटर में संदर्भ वास्तव में असेंबली स्तर पर एक सूचक है, लेकिन compiler_ के साथ अलग-अलग व्यवहार किया जाता है। –
ध्यान दें कि 'c3' एक एल-मान संदर्भ है, आर-मान नहीं। – avakar
"तकनीकी"। आप उस शब्द का इस्तेमाल जारी रखें। मुझे नहीं लगता कि इसका मतलब है कि इसका मतलब क्या है। –