参考调用:
在按引用调用中,我们传递一个指向被调用函数的指针。该指针指向的数据发生的任何更改都会立即反映出来。
假设如果要对该数据进行大量更改,虽然在本地不会产生太多成本,但在网络成本方面会很昂贵,因为每个更改数据都必须复制回客户端。
C 代码:
void addTwo(int *arr, int n){
for(int i=0;i<n;i++){
arr[i]+=2; //change is happening in the original data as well
}
}
int main(){
int arr[100]={1,2,3,...}; // assuming it to be initialised
addTwo(arr,100);
}
通过复制/恢复调用:
在 call-by-copy/restore 中,其思想是当引用数据调用函数时,只有对数据所做的更改的最终结果被复制回原始数据(当函数即将return) 在函数调用过程中不对原始数据做任何更改,只需要一次传输回客户端。
在下面的C 代码中,将arr 指向的数据复制到函数中,并在本地数据的所有更改完成后存储回arr。
C 代码 :
void addTwo(int *arr, int n){
// copy data locally
larr = (int*)malloc(n*sizeof(int));
for(int i=0;i<n;i++){
larr[i]=arr[i];
}
for(int i=0;i<n;i++){
// change is happening to the local variable larr
larr[i]+=2;
}
//copy all the changes made to the local variable back to the original data
for(int i=0;i<n;i++){
arr[i]=larr[i];
}
}
int main(){
int arr[100]={1,2,3,...}; // assuming it to be initialised
addTwo(arr,100);
}
注意:上面显示的代码并不代表实际的 RPC 实现,只是对概念的说明。在真正的 RPC 中,消息中传递的是完整的数据,而不是指针(地址)。