是假堆栈比真堆栈快
Is a fake stack faster than a real stack
本文关键字:堆栈 更新时间:2023-10-16
我正在做一些递归解析。
目前,我有一个假堆栈,在那里我为我的有限状态机存储状态,所以当我递归地向下钻取时,我会推送我所处的状态,然后在处理完递归的文本后弹出它。
有一个像这样的"状态id"堆栈会更快吗
int* stack = 0
int top = 0;
// ...
// drill down bit
if (stack == 0)
stack = (int*)malloc(STACK_JUMP_SIZE);
else if (top % STACK_JUMP_SIZE == 0)
stack = (int*)realloc(stack, (top+STACK_JUMP_SIZE) * sizeof(int));
stack[top++] = currentState;
// ...
// pop up later
{currentState = stack[--top]; {
if (top == 0) {
free(stack);
stack = 0;
} else if ((top+1) % STACK_JUMP_SIZE == 0) {
stack = (int*)realloc(stack, (top+1)*sizeof(int));
}
或者,将它拆分为适当的函数并让C++担心堆栈会更快吗。
(我知道有人会告诉我‘那是C,不是C++’,所以我先发制人地回答,我的程序是C++,但里面有很多C)。
这取决于实施情况—没有办法提前说。在函数调用便宜的机器上(例如SPARC)堆栈可能会更快,但即使存在本地化等问题干预(机器堆栈占用更多空间,因为它堆栈更多信息,而不是模拟堆栈。)我会把它分成正确的递归函数,并且只有在出现以下情况时才尝试手动堆栈管理事实证明是一个瓶颈。除非手动堆栈管理确实具有一个重要的优点是:错误处理。机器堆栈溢出未定义行为:如果malloc
或realloc
返回空指针,则至少可以干净地报告错误。
如果你真的模拟堆栈,你应该考虑使用std::vector
,而不是CCD_ 4/realloc
/CCD_。如果有例外,而且速度可能会快一点。如果可以的话设置堆栈大小的上限,并且它不是不合理的大,将堆栈声明为堆栈上的C样式数组将是偶数更快。
相关文章:
- 算法问题:查找从堆栈中弹出的所有序列
- 使用模板进行堆栈实现; "name followed by :: must be a class or namespace"
- Visual Studio(或任何其他工具)能否将地址解释为调用堆栈(boost上下文)的开头
- 为什么调用堆栈数组会导致内存泄漏
- gdb错误:Backtrace已停止:上一帧与此帧相同(堆栈已损坏?)
- 在 leetcode 上提交解决方案时出现堆栈缓冲区溢出错误
- 我的 int main() 中出现堆栈溢出错误
- 堆栈和队列是否像C++中的数组一样传递?
- 拥有映射的现代方法,该映射可以指向或引用已在堆栈上分配的不同类型的数据
- 为什么 STL 容器适配器堆栈中的 top 返回常量引用?
- 从堆栈分配的原始指针构造智能指针
- 在函数范围内在堆栈上分配的数组在离开函数时是否总是被释放?
- 堆栈中大小变量输入错误 (C++)
- 堆栈问题(平衡表达式问题集)
- C++ 在堆栈中包含多态属性的类对象存储
- 用于解析 win64 堆栈跟踪的命令行客户端(可以访问符号服务器)
- 在 C++ 中使用链表进行堆栈
- 变量周围的堆栈'...'已损坏
- 在 gtest 中初始化堆栈上的引用变量的隔离错误
- C++线程的可用堆栈大小