c++ 堆栈溢出还是尾部递归?

mzillmmw  于 2023-02-14  发布在  其他
关注(0)|答案(2)|浏览(116)

我想知道下面的代码是好是坏。它是关于一个应该由我的API解析的html查询字符串。使用递归来从查询字符串中删除任意数量的'?'是非常方便的。
但是,我想知道这是否会因为递归深度不可控而导致堆栈溢出。我希望这种情况能保证尾部优化,但我不确定。有这样的保证吗?
演示

#include <string_view>
#include <cstdio>

static auto digest_query(std::string_view query) -> void
{
    if (query.front() == '?') {
        // printf("%.*s\n", (int)query.size(), query.data());
        return digest_query(query.substr(1));
    }
    // Do other stuff...
}

int main()
{
    digest_query("???????key=value");
}
92dk7w1h

92dk7w1h1#

有没有这样的保证?
不,没有。

hec6srdp

hec6srdp2#

递归深度不是“不受控制的”,它正好等于前导“?”的个数。每一级都将在堆栈上托管一个字符串变量,但字符串数据本身是在堆上分配的。
所以绝对没有溢出的风险,但是这段代码太低效了!它会涉及到递归调用,字符串分配/释放,字符串复制。所有这些完全没用。我称之为灾难。
我是否应该补充一点,与正则表达式查询或简单的循环相比,我发现它非常不可读(如此出乎意料)?

相关问题