亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

如果有的話,C+編譯器做尾遞歸優化?

如果有的話,C+編譯器做尾遞歸優化?

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

3 回答

?
SMILET

TA貢獻1796條經驗 獲得超4個贊

GCC 4.3.2完全嵌入此函數(糟糕/瑣碎)atoi()執行)main()..優化水平-O1..我注意到如果我玩弄它(甚至改變它staticextern,尾遞歸很快就會消失,所以我不會依賴它來獲得程序的正確性。

#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;}


查看完整回答
反對 回復 2019-07-11
?
九州編程

TA貢獻1785條經驗 獲得超4個贊

除了顯而易見的(編譯器不會進行這種優化,除非您需要它),C+:析構函數中的尾調用優化也很復雜。

例如:

   int fn(int j, int i)
   {
      if (i <= 0) return j;
      Funky cls(j,i);
      return fn(j, i-1);
   }

編譯器不能(通常)對其進行尾調用優化,因為它需要調用cls 遞歸調用返回。

有時編譯器可以看到析構函數沒有外部可見的副作用(因此可以提前完成),但通常不能。

其中一個特別常見的形式就是Funky實際上是std::vector或者類似的。


查看完整回答
反對 回復 2019-07-11
  • 3 回答
  • 0 關注
  • 570 瀏覽

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號