2012-01-13 53 views
13

को प्रतिस्थापित/पुनर्स्थापित करें संदर्भ और कॉल/पुनर्स्थापित द्वारा कॉल के बीच परिणाम में क्या अंतर है?संदर्भ द्वारा कॉल के बीच क्या अंतर है और

पृष्ठभूमि: मैं वर्तमान में वितरित सिस्टम का अध्ययन कर रहा हूं। दूरस्थ प्रक्रिया कॉल के संदर्भ संदर्भों के पारित होने के बारे में, पुस्तक बताती है कि: "संदर्भ द्वारा कॉल प्रतिलिपि/पुनर्स्थापित करके प्रतिस्थापित किया गया है। हालांकि यह हमेशा समान नहीं है, यह पर्याप्त है"। मैं समझता हूं कि संदर्भ में कॉल कैसे करें और सिद्धांत में काम को कॉपी/पुनर्स्थापित करें, लेकिन मैं यह देखने में असफल रहा कि परिणाम में अंतर कहां हो सकता है?

+0

हालांकि मैं आपका जवाब स्वीकार करने में सक्षम था, मुझे बकाया पुरस्कार देने में सक्षम होने के लिए कुछ और घंटों तक इंतजार करना पड़ा। आपके महान उत्तर के लिए धन्यवाद और बक्षीस तुम्हारा है! – mort

+0

आह, मुझे बक्षीस प्रणाली के बारे में पता नहीं था। जानकार अच्छा लगा! – mydogisbox

उत्तर

17

here से लिया गया उदाहरण।

मुख्य कोड:

#include <stdio.h> 

    int a; 

    int main() { 
     a = 3; 
     f(4, &a); 
     printf("&#37;d\n", a); 
     return 0; 
    } 

मान के आधार पर कॉल:।

f(int x, int &y){ 
    // x will be 3 as passed argument 
    x += a; 
    // now a is added to x so x will be 6 
    // but now nothing is done with x anymore 
    a += 2*y; 
    // a is still 3 so the result is 11 
} 

मूल्य में पारित कर दिया और चर में पारित के मूल्य पर कोई प्रभाव नहीं है है

कॉल संदर्भ द्वारा:

f(int x, int &y){ 
    // x will be 3 as passed argument 
    x += a; 
    // now a is added to x so x will be 6 
    // but because & is used x is the same as a 
    // meaning if you change x it will change a 
    a += 2*y; 
    // a is now 6 so the result is 14 
} 

संदर्भ पारित किया गया है। प्रभावी रूप से फ़ंक्शन में चर एक जैसा ही है।

कॉपी के साथ कॉल/पुनर्स्थापित करें:

int a; 
void unsafe(int x) { 
    x= 2; //a is still 1 
    a= 0; //a is now 0 
}//function ends so the value of x is now stored in a -> value of a is now 2 

int main() { 
    a= 1; 
    unsafe(a); //when this ends the value of a will be 2 
    printf("%d\n", a); //prints 2 
} 

मूल्य में पारित हो जाता है और चर समारोह के अंत तक में पारित के मूल्य पर कोई प्रभाव नहीं है, जिस पर की अंतिम मूल्य बात है फ़ंक्शन वेरिएबल पास वैरिएबल में संग्रहीत है।

संदर्भ और प्रतिलिपि/पुनर्स्थापित द्वारा कॉल के बीच मूल अंतर यह है कि फ़ंक्शन वैरिएबल में किए गए परिवर्तन फ़ंक्शन के अंत के बाद पारित चर में दिखाई नहीं देंगे, जबकि संदर्भ परिवर्तनों के अनुसार कॉल तुरंत दिखाई देगा।

+0

आपने उन दोनों में '& y' का उपयोग किया – CodyBugstein

+0

उदाहरण में "कॉपी/पुनर्स्थापित करें के साथ कॉल करें" में, यह' 0 'नहीं' 2 'प्रिंट करता है। – Carlochess

+1

@ करलोचेस कौन सी भाषा प्रतिलिपि/पुनर्स्थापित करने का समर्थन करती है? – mydogisbox

8

कॉपी/पुनर्स्थापना द्वारा कॉल कॉल-दर-संदर्भ का एक विशेष मामला है जहां प्रदान किया गया संदर्भ कॉलर के लिए अद्वितीय है। संदर्भित मानों पर अंतिम परिणाम फ़ंक्शन के अंत तक सहेजा नहीं जाएगा।

इस प्रकार की कॉलिंग उपयोगी है जब संदर्भ द्वारा आरपीसी में एक विधि कहा जाता है। वास्तविक डेटा सर्वर पक्ष को भेजा जाता है और अंतिम परिणाम ग्राहक को भेज देगा। यह यातायात को कम करेगा, क्योंकि सर्वर प्रत्येक बार संदर्भ अद्यतन नहीं करेगा।