f*********m 发帖数: 726 | 1 我知道如果函数func不是recursive的话,func(type arg)和func(type & arg)的区别
,比如func(int i)和func(int& i)。但func是recursive的话,用不用reference有什
么区别?
比如:
void func(type arg){
...
func(arg+1);
...
}
与
void func(type& arg){
...
func(arg+1);
...
}的区别?
recursive会创建很多stack overhead,这是不是说func(type arg)会创建很多arg的
local copy在stack里边,而func(type& arg)只会有一个arg itself?
谢谢。 |
d**e 发帖数: 6098 | 2 我觉得跟recursive没关系,区别应该是一样的。
但我觉得下面的例子不太好。arg+1应该是一个新的临时变量了。
【在 f*********m 的大作中提到】 : 我知道如果函数func不是recursive的话,func(type arg)和func(type & arg)的区别 : ,比如func(int i)和func(int& i)。但func是recursive的话,用不用reference有什 : 么区别? : 比如: : void func(type arg){ : ... : func(arg+1); : ... : } : 与
|
g*********e 发帖数: 14401 | 3 recursive会创建很多stack overhead,这是不是说func(type arg)会创建很多arg的
local copy在stack里边,而func(type& arg)只会有一个arg itself?
我觉的你说的没错。
reference就是一个指针吧,函数传递的就是指针。
不用ref的话,要是arg是一个很大的type,传递起来效率低,每次copy arg占用大量
stack空间。 |
f*********m 发帖数: 726 | 4 谢谢,重新给个例子:
void func(type arg){
...
arg += 1;
func(arg);
...
}
vs.
void func(type& arg){
...
arg += 1;
func(arg);
...
}
当然,传递效率是一个问题。除了这个以外,这两种用法在recursive中还会不会有其
他的不同,比如最终结果。感觉上是不用reference那么各个arg是独立的,不过在
stack理由很多的arg copy,他们的值不一定一样。而用了reference,stack中只有一个
arg,每一次对arg的修改都会影响到整个stack,因为整个stack中只有一个arg。不知我
的理解对否?
recursive应用中哪种arg更好呢?
【在 d**e 的大作中提到】 : 我觉得跟recursive没关系,区别应该是一样的。 : 但我觉得下面的例子不太好。arg+1应该是一个新的临时变量了。
|
d**e 发帖数: 6098 | 5 it depends.
主要是要看你的code是做什么,不是为了追求效率就一定传引用或指针,而是需要看
code里面有没必要修改arg,或者修改arg对整个method需要的结果有没影响。
比如quicksort那两个left和right,我觉得用不用引用应该都一样的,因为不影响后面
的结果。但比如说逆序打印数组, 就不需要传引用。
void printArray(int[] array, int index, int length)
{
if(index >= length)
return;
printArray(array, index+1, length);
cout << array[index] << " ";
}
【在 f*********m 的大作中提到】 : 谢谢,重新给个例子: : void func(type arg){ : ... : arg += 1; : func(arg); : ... : } : vs. : void func(type& arg){ : ...
|
f*********m 发帖数: 726 | 6 “而是需要看code里面有没必要修改arg,或者修改arg对整个method需要的结果有没影
响。”
这确实不好把握。
不过,java是不是传递的都是引用?那么能不能认为传引用更普遍适用些? |