2012-01-13 8 views
13

Qual è la differenza nel risultato tra chiamata per riferimento e copia/ripristino?Qual è la differenza tra chiamata per riferimento e copia/ripristino

Contesto: attualmente sto studiando sistemi distribuiti. Riguardo al passaggio dei parametri di riferimento per le chiamate a procedure remote, il libro afferma che: "la chiamata per riferimento è stata sostituita da copia/ripristino, anche se questo non è sempre identico, è abbastanza buono". Capisco come chiamare per riferimento e copiare/ripristinare il lavoro in linea di principio, ma non riesco a vedere dove può essere una differenza nel risultato?

+0

Sebbene sia stato in grado di accettare la tua risposta, ho dovuto aspettare qualche ora in più per poter assegnare la taglia. Grazie per la tua grande risposta e naturalmente la taglia è tua! – mort

+0

Ah, non lo sapevo del sistema di taglie. Buono a sapersi! – mydogisbox

risposta

17

Esempi presi da here.

codice principale:

#include <stdio.h> 

    int a; 

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

chiamata per valore:.

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 
} 

valore è passato in e non ha alcun effetto sul valore della variabile passata in

Chiamata per riferimento:

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 
} 

Il riferimento è passato. Effettivamente la variabile nella funzione è uguale a quella esterna.

chiamata con copia/Restore:

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 
} 

valore viene passato e non ha alcun effetto sul valore della variabile passata fino alla fine della funzione, a questo punto il valore finale del la variabile di funzione è memorizzata nella variabile passata.

La differenza fondamentale tra chiamata per riferimento e copia/ripristino è che le modifiche apportate alla variabile funzione non verranno visualizzate nella variabile passata fino a dopo la fine della funzione mentre la chiamata con le modifiche di riferimento verrà visualizzata immediatamente.

+0

hai usato '& y' in entrambi – CodyBugstein

+0

Nell'esempio" Chiama con copia/Ripristina ", stampa '0' non '2'. – Carlochess

+1

@Carlochess quale lingua hai usato per copiare/ripristinare? – mydogisbox

8

Call by Copy/Restore è un caso particolare di chiamata per riferimento in cui il riferimento fornito è univoco per il chiamante. Il risultato finale sui valori di riferimento non verrà salvato fino alla fine della funzione.

Questo tipo di chiamata è utile quando un metodo in RPC viene chiamato per riferimento. I dati effettivi vengono inviati al lato server e il risultato finale verrà inviato al client. Ciò ridurrà il traffico, poiché il server non aggiornerà il riferimento ogni volta.

Problemi correlati