我想知道下面的代码是好是坏。它是关于一个应该由我的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");
}
2条答案
按热度按时间92dk7w1h1#
有没有这样的保证?
不,没有。
hec6srdp2#
递归深度不是“不受控制的”,它正好等于前导“?”的个数。每一级都将在堆栈上托管一个字符串变量,但字符串数据本身是在堆上分配的。
所以绝对没有溢出的风险,但是这段代码太低效了!它会涉及到递归调用,字符串分配/释放,字符串复制。所有这些完全没用。我称之为灾难。
我是否应该补充一点,与正则表达式查询或简单的循环相比,我发现它非常不可读(如此出乎意料)?