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 ¶m) { // 可以把param當成是一般的變數使用 // 但他又很像是Call by Pointer記憶體位址會被設成 // 跟傳入變數一樣(任何的異動都會影響到num) // 不過卻又不像Call by Pointer,因為不能修改 // 記憶體位址,而且呼叫方式是跟Call by Value一樣 .....;}// 呼叫方式1int num;test(num);// 呼叫方式2int *num;test(*num);
沒有留言:
張貼留言