遞迴演算法具有程式容易編寫的特點;然而,由於編譯器預分配堆疊空間的限制,遞迴深度並不是無限制的。
在遞迴過程中,系統將對當前程式執行狀態儲存(壓入堆疊),並將引數壓棧,然後遞迴。
在遞迴完成後,則做出棧操作。
當遞迴深度很深時,由於堆疊滿,遞迴無法繼續。
那麼,遞迴深度到底是多少呢?如果我們建立無引數傳遞的遞迴,是否會更節省記憶體,從而,加大遞迴深度呢?
程式:測試c++編譯器的遞迴深度
/*
測試c++語言的遞迴深度
g++結果:
f: 43273
f1: 43273
f2: 43266
vc2012結果:
f:85588
f1:44998
f2: 42773
*/#include using namespace std;
int n;
int times = 0;
void f()
}void f1(int n)
}typedef struct data data;
void f2(int n, data data)
}int main()
從上述程式似乎可以看出,在確定的編譯器及編譯引數下,不同引數傳遞方式似乎對遞迴深度沒有太大影響。
問題:到底是編譯器對遞迴深度有限制?還是記憶體不夠用了?
結果:遞迴演算法應慎用!
尾遞迴與編譯器優化
在計算機中,程式執行中的函式呼叫是借助棧實現的 每當進入乙個新的函式呼叫,棧就會增加一層棧幀,每當函式返回,棧就會減少一層棧幀。這個棧的大小是有限的 貌似是1m或者2m 所以在執行遞迴的過程中遞迴的次數是有限度的,超過某個不是很大的值就會爆棧 棧溢位 以求解fabonacci問題為例 使用遞迴的方式...
C 編譯器優化
1 volatile 順序性 兩個包含volatile變數的指令,編譯後不可以亂序。注意是編譯後不亂序,但是在執行的過程中還是可能會亂序的,這點需要由其它機制來保證,例如memory barriers。不可優化性 volatile告訴編譯器,不要對這個變數進行各種激進的優化,甚至將變數直接消除,保證...
C 編譯器優化
1 volatile 順序性 兩個包含volatile變數的指令,編譯後不可以亂序。注意是編譯後不亂序,但是在執行的過程中還是可能會亂序的,這點需要由其它機制來保證,例如memory barriers。不可優化性 volatile告訴編譯器,不要對這個變數進行各種激進的優化,甚至將變數直接消除,保證...