水木上有人貼了個有趣的程序



















用gcc -O2編譯運(yùn)行后會不停地打印從0開始的自然數(shù),注意如果編譯器沒有做優(yōu)化的話,打印到某個數(shù)的時候肯定會發(fā)生棧溢出從而程序終止的情況,但這個程序卻能一直運(yùn)行下去,說明編譯器做了尾遞歸優(yōu)化。
用gcc -O2 -S生成這個程序的匯編代碼后證實了這一點。







接下來是分析哪個優(yōu)化選項處理了尾遞歸。
用O3 O2 O1三個優(yōu)化強(qiáng)度編譯程序,查看匯編代碼后,發(fā)現(xiàn)尾遞歸優(yōu)化是O2中新增的功能。于是查看O2新開啟的優(yōu)化開關(guān):
gcc -c -Q -O1 --help=optimizers > /tmp/O1-opts
gcc -c -Q -O2 --help=optimizers > /tmp/O2-opts
diff /tmp/O2-opts /tmp/O1-opts?| grep enabled
輸出結(jié)果:


























經(jīng)證實是-foptimize-sibling-calls這個選項實現(xiàn)了尾遞歸的優(yōu)化,具體內(nèi)容可以參看
http://gcc.gnu.org./ml/gcc-patches/2000-03/msg00867.html