因为递归具有推送和弹出激活记录的额外开销,所以在使用常量时是否可以避免这种情况?
例如,如果我有一个功能
void foo(int x) {
int bar = x;
fooAux(root);
}
fooAux(Root * root) {
// Can I somehow do something with the variable bar here?
// {Insert recursive code}
}
我不确定除了将bar传递给递归函数之外是否有任何其他方法,但这似乎是不必要的,因为我确定它的值不是要改变?也许通过引用传递可以缓解此事?请思考。
答案 0 :(得分:1)
您可以使用全局变量执行此操作,例如:g_bar
。
但是,这使您的功能既不是可重入的也不是优雅的。
你也可以创建一个由上面两个函数和一个bar
成员变量组成的独立结构,这将是魔鬼过早优化的一个很好的例子。
答案 1 :(得分:1)
问题不是很清楚,在标题中引用“常量”,但在代码示例中使用变量。
无论如何答案是肯定的,只要线程安全性不是问题,递归辅助函数就可以很容易地引用非递归调用函数中的常量或变量。
您需要做的就是声明变量static
:
struct Whatever {};
void foo( int x )
{
static int bar;
struct Aux
{
static void foo( Whatever )
{
(void) bar;
}
};
bar = x;
Aux::foo( Whatever() );
}
这是个好主意吗?不,它有点过早优化。速度增益(如果有的话)是微不足道的,而维护成本可能很高。
答案 2 :(得分:0)
如果我理解正确,你的问题主要不是关于递归,而是关于范围界定。也许您还可以接受以下答案:函数是否可以访问未作为参数传递的变量(也未在本地定义)
这个问题的答案是"是"。有几种选择:
bar
变量可以存在。但是,C ++中没有闭包,我不知道在C ++中模仿闭包的任何优雅方式。也是出于语义原因而发明的闭包(它为程序员提供了更多的功能),而不是出于性能原因。