内存优化C中的递归调用

Bri*_*don 7 c recursion

我有一个递归函数,可以写成:

void func(TypeName *dataStructure, LL_Node **accumulator) {
    func(datastructure->left, accumulator);
    func(datastructure->right, accumulator);

    {
        char buffer[1000];
        // do some stuff
    }

    return;
}        
Run Code Online (Sandbox Code Playgroud)

我知道实际上缓冲区是在函数的开头分配的,并且将语句放在嵌套的范围块中实际上并不使用新的堆栈帧.但是我不希望编译器一次分配一个指数数量的1000字节缓冲区,当它们可以在每个级别返回时分配和丢弃一次.

我应该使用外部全局变量吗?调用辅助函数强制在递归调用后分配缓冲区?我真正想要捕获的是关于强制这种行为的最干净,最常用的C语言方法的建议.

编辑:一个附加问题.如果将完全相同的内容accumulator传递给每次调用func,那么将accumulator指针留在全局变量而不是每次调用时将其推入堆栈都是闻所未闻的吗?

Mys*_*ial 4

由于它一次仅由一个调用使用,因此您可以预先分配它并通过操作数将其传递给所有调用:

void func(TypeName *dataStructure, LL_Node **accumulator, char *buffer) {
    func(datastructure->left, accumulator, buffer);
    func(datastructure->right, accumulator, buffer);

    {
        // do some stuff
    }

    return;
}  
Run Code Online (Sandbox Code Playgroud)

  • 要添加到 Mystical 的解决方案中,如果您的“func”作为模块/应用程序的 API 的一部分公开,那么最好保留原始签名“void func(TypeName *dataStructure, LL_Node **accumulator)”和在该函数中声明一个本地“char buffer[10000]”并委托给内部“func_impl(dataStructure,accumulator,buffer)”以隐藏临时缓冲区空间的实现细节。这样,客户端代码就可以处理更简单、更清晰的 API。 (4认同)