我正在做一些遞歸解析。是一個虛擬棧比一個真正的棧更快
目前我有一個假的堆棧,在那裏我爲我的有限狀態機存儲狀態,所以當我遞歸地向下鑽取時,我推入了我所處的狀態,稍後在完成處理遞歸位文本後彈出它。
難道是快有一個「狀態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)。
我個人認爲正常的功能會更快..但是有人比我想的要多很多,我覺得這個假的堆棧更快。現在我想看到更多的人比我更多的意見:) – matiu 2012-02-17 10:25:18
@matu這取決於機器。在Sparc上,函數調用需要零內存訪問,並且可能會更快。在英特爾,你最終會將你的返回地址和幀指針保存在內存中,以及該函數需要的任何參數:這可能非常昂貴。 – 2012-02-17 10:43:50