C 編譯器的遞迴深度與程式優化思考

2021-09-06 09:03:01 字數 737 閱讀 1914

遞迴演算法具有程式容易編寫的特點;然而,由於編譯器預分配堆疊空間的限制,遞迴深度並不是無限制的。

在遞迴過程中,系統將對當前程式執行狀態儲存(壓入堆疊),並將引數壓棧,然後遞迴。

在遞迴完成後,則做出棧操作。

當遞迴深度很深時,由於堆疊滿,遞迴無法繼續。

那麼,遞迴深度到底是多少呢?如果我們建立無引數傳遞的遞迴,是否會更節省記憶體,從而,加大遞迴深度呢?

程式:測試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告訴編譯器,不要對這個變數進行各種激進的優化,甚至將變數直接消除,保證...