C++ 这种循环方法会是个坏主意吗?
我正在构建一个html/xml切片器(将文本切割成一个有意义的块列表,如elementStart、plainText等,然后我可以使用它以OO方式构造元素) 我发现创建一个用于处理各种模式的逻辑sub很方便,主循环信息保存在类变量中,而sub做一些工作,然后根据遇到的数据将火炬传递给另一个。但我突然想到,这可能会导致一些问题(比如堆栈溢出?idk),因为从技术上讲,在整个过程完成之前,它不会退出任何一个sub。我的意思是:(在伪代码中)C++ 这种循环方法会是个坏主意吗?,c++,C++,我正在构建一个html/xml切片器(将文本切割成一个有意义的块列表,如elementStart、plainText等,然后我可以使用它以OO方式构造元素) 我发现创建一个用于处理各种模式的逻辑sub很方便,主循环信息保存在类变量中,而sub做一些工作,然后根据遇到的数据将火炬传递给另一个。但我突然想到,这可能会导致一些问题(比如堆栈溢出?idk),因为从技术上讲,在整个过程完成之前,它不会退出任何一个sub。我的意思是:(在伪代码中) void plainLogic(){ //查找“您可能希望
void plainLogic(){
//查找“您可能希望使用分派表,或查看状态机设计模式。您正在显示的特定函数仅用于编译器可以优化以不填充堆栈的函数。但是使用递归是编译器工程中非常常见的技术。这可能无法避免。如果您担心利用此漏洞,如果嵌套太深,可能会设置健全限制并拒绝输入。@5gon12eder编译器可以优化尾部调用,但不能保证它会优化尾部调用,如果不优化,堆栈溢出是一个真正的问题。在XML解析器中避免递归当然是可行的。我甚至认为这是一个好主意,特别是在递归的情况下将导致您设置不必要的深度限制。目前,我设置了一个类作用域状态值,而不是进入另一个子系统,所有子系统返回到一个主循环子系统,然后根据状态执行下一个子系统。每个状态之间有一个额外的switch语句更改,但不会对性能造成明显的影响曼斯。
void plainLogic() {
// look for '<' with something other than space after it
// add the gathered data to the slice list
switch (data[it]) // <- the something other
{
case '!':
commentLogic();
break;
case '/':
elEndLogic();
break;
default:
elStartLogic();
break;
}
}