2012-01-13 14 views
13

¿Cuál es la diferencia en el resultado entre llamada por referencia y copia/restauración?Cuál es la diferencia entre llamada por referencia y copia/restauración

Antecedentes: Actualmente estoy estudiando sistemas distribuidos. En cuanto al paso de los parámetros de referencia para las llamadas a procedimiento remoto, el libro indica que: "la llamada por referencia ha sido reemplazada por copia/restauración. Aunque esto no siempre es idéntico, es lo suficientemente bueno". Entiendo cómo llamar por referencia y copiar/restaurar el trabajo en principio, pero no veo dónde puede haber una diferencia en el resultado.

+0

Aunque pude aceptar su respuesta, tuve que esperar unas horas más para poder otorgar la recompensa. Gracias por su gran respuesta y la recompensa es suya, por supuesto! – mort

+0

Ah, no sabía eso sobre el sistema de recompensas. ¡Bueno saber! – mydogisbox

Respuesta

17

Ejemplos tomados de here.

Código principal:

#include <stdio.h> 

    int a; 

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

llamada por valor:.

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 
} 

valor se pasa en y no tiene ningún efecto sobre el valor de la variable pasada en

Call por Referencia:

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 
} 

Se transfiere la referencia. Efectivamente, la variable en la función es la misma que en el exterior.

llamada con Copiar/Restaurar:

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 
} 

valor se pasa en y no tiene ningún efecto sobre el valor de la variable que se pasa hasta el final de la función, en cuyo punto el valor final de la la variable de función se almacena en la variable pasada.

La diferencia básica entre llamada por referencia y copia/restauración es que los cambios realizados en la variable de función no aparecerán en la variable pasada hasta después del final de la función, mientras que los cambios de llamada por referencia se verán inmediatamente.

+0

usó 'y y' en los dos – CodyBugstein

+0

En el ejemplo" Llamar con Copiar/Restaurar ", imprime '0' no '2'. – Carlochess

+1

@Carlochess ¿Qué idioma admite copia/restauración usó? – mydogisbox

8

Llamar por Copiar/Restaurar es un caso especial de llamada por referencia en el que la referencia proporcionada es exclusiva de la persona que llama. El resultado final en los valores a los que se hace referencia no se guardará hasta el final de la función.

Este tipo de llamada es útil cuando se llama a un método en RPC por referencia. Los datos reales se envían al servidor y el resultado final se envía al cliente. Esto reducirá el tráfico, ya que el servidor no actualizará la referencia cada vez.

Cuestiones relacionadas