3
我有遞歸但不是尾遞歸內聯函數,我希望gcc展開遞歸。是的,我當然使用g++ -O3 -funroll-loops
。g ++/gcc在展開遞歸內聯函數時有多有效?
inline void recurse_fun(..., unsigned depth = 0, unsigned max_depth = 40) {
if (++depth > max_depth) return;
for (auto i = ..., iend = ...; i != iend; i++) {
if (...) continue;
...
recurse_fun(...,depth,max_depth);
}
}
我可以很容易地通過手動操作一個stack<...>
對象,GCC應該正常展開代替這一點,但它不會被視爲相當優雅或維護。
我應該真的嘗試分析這兩個版本無論如何,但我很好奇,如果任何人都可以有信心地說,一些最新的海灣合作委員會版本會或不會正確處理這個。
相關:http://ridiculousfish.com/blog/posts/will-it-optimize.html –
你能看看生成的彙編語言嗎?此外,1)任何這麼做的函數都會從內聯中看到微不足道的好處,並且2)編譯器是否內聯遞歸函數?這會讓我感到驚訝。 3)如果你的意思是展開內部循環,那麼如果內部有一個函數調用,那麼也不會節省很多。 –
不錯的發現,喬希李! :)是的,我認爲閱讀彙編程序比閱讀探查程序Mike Dunlavey容易得多。 –