Redian新闻
>
recursive中该用reference 还是普通变量传递?
avatar
recursive中该用reference 还是普通变量传递?# JobHunting - 待字闺中
f*m
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?
谢谢。
avatar
d*e
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);
: ...
: }
: 与

avatar
g*e
3
recursive会创建很多stack overhead,这是不是说func(type arg)会创建很多arg的
local copy在stack里边,而func(type& arg)只会有一个arg itself?
我觉的你说的没错。
reference就是一个指针吧,函数传递的就是指针。
不用ref的话,要是arg是一个很大的type,传递起来效率低,每次copy arg占用大量
stack空间。
avatar
f*m
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应该是一个新的临时变量了。

avatar
d*e
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){
: ...

avatar
f*m
6
“而是需要看code里面有没必要修改arg,或者修改arg对整个method需要的结果有没影
响。”
这确实不好把握。
不过,java是不是传递的都是引用?那么能不能认为传引用更普遍适用些?
相关阅读
logo
联系我们隐私协议©2024 redian.news
Redian新闻
Redian.news刊载任何文章,不代表同意其说法或描述,仅为提供更多信息,也不构成任何建议。文章信息的合法性及真实性由其作者负责,与Redian.news及其运营公司无关。欢迎投稿,如发现稿件侵权,或作者不愿在本网发表文章,请版权拥有者通知本网处理。