伪造的堆栈比真正的堆栈更快

时间:2012-02-17 10:21:56

标签: c++ c performance fsm

我正在进行一些递归解析。

目前我有一个假堆栈,我在那里为有限状态机存储状态,所以当我递归地向下钻取时,我按下我所处的状态,并在我完成处理递归的文本后稍后弹出它。

拥有像'状态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。)

1 个答案:

答案 0 :(得分:9)

这取决于实施 - 没有办法事先说出来。 在函数调用便宜的机器上(例如SPARC),函数 堆栈可能会更快,但即使在那里,本地化等问题 干预。 (机器堆栈需要更多空间,因为它堆叠更多 信息,而不是你的模拟堆栈。)我把事情拆分成了 适当的递归函数,如果这样,只尝试手动堆栈管理 被证明是一个瓶颈。除非......手动堆栈管理确实有 一个重要的优点:错误处理。机器堆栈溢出 未定义的行为:如果mallocrealloc返回空指针,则为 至少可以干净地报告错误。

如果您模拟堆栈,则应考虑使用std::vector, 而不是malloc / realloc / free。如果有的话它会救你 异常,它也可能更快一点。如果你可以的话 设置堆栈大小的上限,并不是不合理的大, 将堆栈声明为堆栈上的C样式数组将是均匀的 更快。