如果有的話,C+編譯器做尾遞歸優化?在我看來,在C和C+中進行尾遞歸優化是非常好的,但是在調試過程中,我似乎從來沒有看到過一個框架堆棧來表示這種優化。這很好,因為堆棧告訴我遞歸有多深。但是,優化也會很好。有C+編譯器做這個優化嗎?為什么?為什么不行?我該如何告訴編譯器這樣做呢?對于MSVC:/O2或/OxGCC:-O2或-O3檢查編譯器是否在特定情況下完成了此操作如何?對于MSVC,使PDB輸出能夠跟蹤代碼,然后檢查代碼。為了GCC.?我仍然會建議如何確定某個函數是否是由編譯器像這樣優化的(盡管我覺得它可以讓Konrad讓我放心地假定它)。始終可以通過進行無限遞歸并檢查它是否導致無限循環或堆棧溢出來檢查編譯器是否做到了這一點(我是與GCC一起這樣做的,并發現-O2),但是我希望能夠檢查一個我知道無論如何都會終止的函數。我希望有一種簡單的方法來檢查這個:)經過一些測試,我發現析構函數破壞了進行這種優化的可能性。有時候,更改某些變量和臨時變量的作用域以確保它們在返回語句開始之前超出范圍是值得的。如果需要在尾調用之后運行任何析構函數,則無法進行尾調用優化。
3 回答

SMILET
TA貢獻1796條經驗 獲得超4個贊
atoi()
main()
-O1
static
extern
#include <stdio.h>static int atoi(const char *str, int n){ if (str == 0 || *str == 0) return n; return atoi(str+1, n*10 + *str-'0');}int main(int argc, char **argv){ for (int i = 1; i != argc; ++i) printf("%s -> %d\n", argv[i], atoi(argv[i], 0)); return 0;}

九州編程
TA貢獻1785條經驗 獲得超4個贊
int fn(int j, int i) { if (i <= 0) return j; Funky cls(j,i); return fn(j, i-1); }
cls
后
Funky
std::vector
- 3 回答
- 0 關注
- 570 瀏覽
添加回答
舉報
0/150
提交
取消