2011-09-29 15 views
6

संभव डुप्लिकेट:
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 को असाइन किया गया है। क्या ये सच है?

क्या कोई कह सकता है कि मेरी धारणाएं सही हैं या यदि मैं पूरी तरह से ट्रैक से बाहर हूं? जब तक संकल्प को कॉल करने की बात आती है, तब तक मैंने हमेशा आर-वैल्यू संदर्भों को एक फ़ंक्शन/विधियों के हस्ताक्षर (संभावित रूप से एक चाल-सीटीआर) से मेल खाने के बारे में सोचा था, ताकि कोडर जानता है कि प्रदान किए गए डेटा का इलाज कैसे करें (एक चाल-सीटीआर के लिए जो इसे कॉपी करने के बजाय डेटा ले जायेगा)।

इस बदसूरत प्रयास की रक्षा करने के लिए मैंने अभी प्रस्तुत किया है: मैं अपने कोड के साथ एएसएम स्तर पर घूमने का इरादा नहीं रखता हूं, मैं केवल यह समझना चाहता हूं कि आर-वैल्यू संदर्भों के आसपास के बाकी हिस्सों की तुलना में तकनीकी अंतर क्या है इन सभी वर्षों।

कोई अंतर्दृष्टि और स्पष्टीकरण स्वागत से अधिक हैं!

धन्यवाद!

+3

(unoptimized) विधानसभा स्तर पर, एक आर-मूल्य सिर्फ एक एल मूल्य, संदर्भ, या "मूल्य" की तरह, एक वस्तु का एक उदाहरण है। आर-वैल्यू बस _compiler_ को बताता है जो कॉपी/निर्माण के लिए उपयोग करने के लिए काम करता है। यह किसी ऑब्जेक्ट या पैरामीटर में संदर्भ वास्तव में असेंबली स्तर पर एक सूचक है, लेकिन compiler_ के साथ अलग-अलग व्यवहार किया जाता है। –

+1

ध्यान दें कि 'c3' एक एल-मान संदर्भ है, आर-मान नहीं। – avakar

+3

"तकनीकी"। आप उस शब्द का इस्तेमाल जारी रखें। मुझे नहीं लगता कि इसका मतलब है कि इसका मतलब क्या है। –

उत्तर

8

आर-वैल्यू संदर्भ बनाए जाने पर असेंबलर स्तर पर क्या होता है।

उच्च स्तरीय अर्थशास्त्र को संरक्षित करने के लिए जो कुछ भी आवश्यक है। क्या कंपाइलर वास्तव में इस बात पर निर्भर करता है कि कंपाइलर विक्रेता विचार एक अच्छा विचार होगा। असेंबली में लालसा, राजस्व, या संदर्भों की कोई अवधारणा नहीं है, इसलिए उन्हें ढूंढना बंद करें। ऑप्टिमाइज़ेशन चालू करें, और जिस कोड को आप देख रहे हैं वह संभवतः बदल जाएगा (या मौजूदा रूप से बंद हो सकता है, यदि चर का उपयोग नहीं किया जाता है)।

मैं बस इन सभी वर्षों के आसपास के बाकी हिस्सों की तुलना में तकनीकी अंतर आर-वैल्यू संदर्भ प्रस्तुत करना चाहता हूं।

रावल संदर्भ संदर्भ सेमेन्टिक्स को सक्षम करते हैं, और बदले में महत्वपूर्ण अनुकूलन अवसर सक्षम होते हैं।मानक यह नहीं कहता "ओह, ये रैल्यू रेफ हैं, और इस तरह आपको उन्हें असेंबली में लागू करना चाहिए"। कार्यान्वयन भी असेंबली का उत्पादन नहीं कर सकता है।

4

अनुकूलन करने से पहले, एक संदर्भ एक सूचक बाध्य वस्तु का पता युक्त के रूप में मौजूद है।

लेकिन संकलक इसे दूर अनुकूलन करने के लिए बहुत मेहनत की कोशिश करता है। विशेष रूप से इनलाइनिंग एक छोटे से फ़ंक्शन के अंदर संदर्भ पैरामीटर के सभी उपयोग को एक रजिस्टर के प्रत्यक्ष उपयोग द्वारा प्रतिस्थापित किया जा सकता है जिसमें बाध्य ऑब्जेक्ट का मान होता है।

6

rvalue संदर्भ एएसएम स्तर पर अलग नहीं है - यह नियमित refernces के रूप में बिल्कुल वैसा ही हो सकता है (कैसे संकलक यह हालांकि देखता है पर निर्भर करता है)। अंतर केवल सी ++ लांगी स्तर पर मौजूद है। सूचना आर-मान संदर्भ ले जा रहा है कि संदर्भित वस्तु अस्थायी है, और इसे प्राप्त करने वाला कोई भी इसे संशोधित करने के लिए स्वतंत्र है। ऑब्जेक्ट स्थान के बारे में जानकारी को नियमित संदर्भों के साथ बिल्कुल स्थानांतरित किया जा सकता है (संकलक इसे अलग-अलग अनुकूलित करने का प्रयास कर सकता है, लेकिन यह संकलक का आंतरिक मामला है)।

आर-मूल्य refernce और गैर स्थिरांक एल-मूल्य संदर्भ के बीच अंतर यह है कि हर एल-मूल्य स्वचालित रूप से (इस प्रकार आकस्मिक संशोधनों को रोकने) केवल एल-मूल्य संदर्भ के लिए casted हो जाएगा, जबकि आर value'd भाव होगा दोनों को परिवर्तित करें (आर-वैल्यू रेफरी प्रीफर्ड के साथ), मूव सेमेन्टिक्स और नियमित कॉल की इजाजत देता है यदि सैमांटिक्स को असमर्थित किया जाता है। std :: move l-values ​​के गैर-स्वचालित कास्टिंग को आर-मान संदर्भों में अनुमति देने से कुछ और नहीं कर रहा है।

0

rvalue संदर्भ अवधारणा पूरी तरह से सी ++ पर स्तर में वर्णित किया जा सकता है, कोई इस बात के लिए विधानसभा कोड को पढ़ने के लिए जरूरत नहीं है। आपको केवल कुछ न्यूनतम सी ++ कक्षा प्राप्त करने की आवश्यकता है जो आंतरिक संसाधन आवंटित करता है, और किसी अन्य वस्तु द्वारा "चोरी" रावल संदर्भ संसाधन स्पष्ट है। इस क्लासिक आलेख से remote_integer क्लास की तरह: http://blogs.msdn.com/b/vcblog/archive/2009/02/03/rvalue-references-c-0x-features-in-vc10-part-2.aspx इस कोड के लिए असेंबली अनुवाद बहुत सरल है, लेकिन अंतर C++ कोड में देखा जाता है। चार तरह के सरल प्रकारों के बारे में - इन्हें कुछ राल्लू संदर्भ वाक्यविन्यास सुविधाओं को कम करने के लिए उपयोग किया जा सकता है, लेकिन सी ++ और असेंबली स्तर दोनों पर इस प्रकार के रावल संदर्भों का उपयोग करने की कोई संभावना नहीं है। इसलिए, यदि आपको C++ में char & & c का उपयोग करने में कोई लाभ नहीं दिखाई देता है, तो विधानसभा में कुछ भी दिलचस्प नहीं है।

संबंधित मुद्दे