2012-01-13 36 views
13

Sự khác biệt trong kết quả giữa cuộc gọi bằng cách tham chiếu và sao chép/khôi phục là gì?Sự khác nhau giữa cuộc gọi bằng cách tham chiếu và sao chép/khôi phục

Thông tin cơ bản: Tôi hiện đang nghiên cứu các hệ thống phân tán. Liên quan đến việc truyền tham số cho các cuộc gọi thủ tục từ xa, cuốn sách nói rằng: "cuộc gọi bằng cách tham chiếu đã được thay thế bằng sao chép/khôi phục. Mặc dù điều này không phải lúc nào cũng giống nhau, nhưng nó đủ tốt". Tôi hiểu cách gọi bằng tham chiếu và sao chép/khôi phục công việc về nguyên tắc, nhưng tôi không thấy sự khác biệt trong kết quả có thể là gì?

+0

Mặc dù tôi đã có thể chấp nhận câu trả lời của bạn, tôi phải đợi thêm vài giờ nữa mới có thể nhận được tiền thưởng. Cảm ơn câu trả lời tuyệt vời của bạn và tiền thưởng là của bạn tất nhiên! – mort

+0

Ah, tôi không biết điều đó về hệ thống tiền thưởng. Tốt để biết! – mydogisbox

Trả lời

17

Ví dụ được lấy từ here.

mã chính:

#include <stdio.h> 

    int a; 

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

Gọi bằng Value:.

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 
} 

Giá trị được truyền vào và không ảnh hưởng đến giá trị của biến được truyền trong

Gọi bằng cách tham chiếu:

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 
} 

Tham chiếu được chuyển vào. Hiệu quả biến trong hàm cũng giống như biến bên ngoài.

Gọi với Copy/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 
} 

Giá trị được truyền vào và không ảnh hưởng đến giá trị của biến được truyền vào cho đến khi kết thúc chức năng, lúc này giá trị cuối cùng của biến chức năng được lưu trữ trong biến được truyền trong biến.

Sự khác biệt cơ bản giữa cuộc gọi bằng tham chiếu và sao chép/khôi phục sau đó là thay đổi được thực hiện cho biến chức năng sẽ không hiển thị trong biến được truyền cho đến sau khi kết thúc hàm trong khi gọi bằng thay đổi tham chiếu sẽ được nhìn thấy ngay lập tức.

+0

bạn đã sử dụng '& y' trong cả hai số này – CodyBugstein

+0

Trong ví dụ" Gọi bằng Sao chép/Khôi phục ", nó in '0' không phải '2'. – Carlochess

+1

@Carlochess ngôn ngữ nào hỗ trợ sao chép/phục hồi mà bạn đã sử dụng? – mydogisbox

8

Gọi bằng Sao chép/Khôi phục là trường hợp đặc biệt gọi tham chiếu khi tham chiếu được cung cấp là duy nhất cho người gọi. Kết quả cuối cùng trên các giá trị được tham chiếu sẽ không được lưu cho đến khi kết thúc hàm.

Kiểu gọi này hữu ích khi phương thức trong RPC được gọi bằng tham chiếu. Dữ liệu thực tế được gửi đến phía máy chủ và kết quả cuối cùng sẽ gửi cho khách hàng. Điều này sẽ làm giảm lưu lượng truy cập, vì máy chủ sẽ không cập nhật tham chiếu mỗi lần.

Các vấn đề liên quan