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
1 2 3 4 5 6 7 8 |
int main(){ int a = 10; plus(a); } int plus(int a){ //兩個a位於不同記憶體空間 return a++; } |
//call by address
1 2 3 4 5 6 7 8 |
int main(){ int a = 10; plus(&a); // a = 11 } void plus(int* a){ //傳入a的記憶體位置,function中的a pointer指向main中的a變數<br /> (*a)++; } |
//call by reference
1 2 3 4 5 6 7 8 |
int main(){ int a = 10; plus(a); // a = 11; } void plus(int &a){ //作用與call by address相同,寫法更簡潔 但僅限C++ only a++; } |
詳細補充:
Call by Value
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
// 宣告方式 void test(int param) { // 參數在傳入時會copy一份到param // 所以如果傳入的是一個大量的資料,則會使程式效能變差 // 但是在function內對param異動都不會影響num .....; } // 呼叫方式1 int num; test(num); // 呼叫方式2 int *num; test(*num); |
.
Call by Pointer
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 |
// 宣告方式 void test(int *param) { // param接收的是記憶體位址,所以呼叫時要特別注意 // 在function內對param做任何的異動都會影響到num .....; // 但是可以把param的記憶體位址再改掉 int temp; param = &temp; } // 呼叫方式1 int num; test(&num); // 呼叫方式2 int *num; test(num); |
.
Call by Reference
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
// 宣告方式 void test(int &param) { // 可以把param當成是一般的變數使用 // 但他又很像是Call by Pointer記憶體位址會被設成 // 跟傳入變數一樣(任何的異動都會影響到num) // 不過卻又不像Call by Pointer,因為不能修改 // 記憶體位址,而且呼叫方式是跟Call by Value一樣 .....; } // 呼叫方式1 int num; test(num); // 呼叫方式2 int *num; test(*num); |
自動引用通知: 軟體面試 C 語言 常見題目 | 易春木
謝謝你詳細的分享
整理的很詳細,收穫很大
呵, 這是軟體工程師必考題啊