2018/01/06

C/C++: 請說明 call by value, address, reference 三者差異? (比較速度/用 法/詳細補充)

1. 速度效能

Reference (address) > Value
call by value 是速度最慢的,call by ref與 call by addr 速度相同! call by value慢是因為它必須先 copy一份再傳給被呼叫者

64: Call_by_ref(k1);//call by reference
004012F8 lea eax,[ebp-4] ;抓出k1的指標
004012FB push eax ;從stack傳出指標參數
004012FC call @ILT+10(Call_by_ref) (0040100f) ;呼叫Call_by_ref
00401301 add esp,4 ;平衡stack
65: Call_by_ptr(&k1);//call by address
00401304 lea ecx,[ebp-4] ;抓出k1的指標
00401307 push ecx ;從stack傳出指標參數
00401308 call @ILT+15(Call_by_ptr) (00401014);呼叫Call_by_ptr
0040130D add esp,4 ;平衡stack
注意到 不論是傳址或傳參照,翻出來的程式碼都是一樣的。
換句話說實際上它們都是以傳址來實現(沒有所謂傳照就可以不複製地址)
http://ehome.hifly.to/showthread.php?s=&threadid=148

2.三者的用法

//call by value

 int main(){    int a = 10;    plus(a); } int plus(int a){    //兩個a位於不同記憶體空間    return a++; }

//call by address

 int main(){   int a = 10;   plus(&a); // a = 11}void plus(int* a){    //傳入a的記憶體位置,function中的a pointer指向main中的a變數
(*a)++; }

//call by reference

int main(){    int a = 10;    plus(a); // a = 11; } void plus(int &a){    //作用與call by address相同,寫法更簡潔 但僅限C++ only    a++; }

詳細補充:

Call by Value

// 宣告方式void test(int param) {    // 參數在傳入時會copy一份到param    // 所以如果傳入的是一個大量的資料,則會使程式效能變差    // 但是在function內對param異動都不會影響num    .....;}// 呼叫方式1int num;test(num);// 呼叫方式2int *num;test(*num);

.

Call by Pointer

// 宣告方式void test(int *param) {    // param接收的是記憶體位址,所以呼叫時要特別注意    // 在function內對param做任何的異動都會影響到num    .....;    // 但是可以把param的記憶體位址再改掉    int temp;    param = &temp;}// 呼叫方式1int num;test(&num);// 呼叫方式2int *num;test(num);

.

Call by Reference

// 宣告方式void test(int &param) {    // 可以把param當成是一般的變數使用    // 但他又很像是Call by Pointer記憶體位址會被設成    // 跟傳入變數一樣(任何的異動都會影響到num)    // 不過卻又不像Call by Pointer,因為不能修改    // 記憶體位址,而且呼叫方式是跟Call by Value一樣    .....;}// 呼叫方式1int num;test(num);// 呼叫方式2int *num;test(*num);

沒有留言:

張貼留言