我正在进行一些递归解析。
目前我有一个假堆栈,我在那里为有限状态机存储状态,所以当我递归地向下钻取时,我按下我所处的状态,并在我完成处理递归的文本后稍后弹出它。
拥有像'状态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。)
答案 0 :(得分:9)
这取决于实施 - 没有办法事先说出来。
在函数调用便宜的机器上(例如SPARC),函数
堆栈可能会更快,但即使在那里,本地化等问题
干预。 (机器堆栈需要更多空间,因为它堆叠更多
信息,而不是你的模拟堆栈。)我把事情拆分成了
适当的递归函数,如果这样,只尝试手动堆栈管理
被证明是一个瓶颈。除非......手动堆栈管理确实有
一个重要的优点:错误处理。机器堆栈溢出
未定义的行为:如果malloc
或realloc
返回空指针,则为
至少可以干净地报告错误。
如果您模拟堆栈,则应考虑使用std::vector
,
而不是malloc
/ realloc
/ free
。如果有的话它会救你
异常,它也可能更快一点。如果你可以的话
设置堆栈大小的上限,并不是不合理的大,
将堆栈声明为堆栈上的C样式数组将是均匀的
更快。