2

以下は、おもちゃのプログラミング言語用にプログラムで生成されたスニペットです。実際のコードは異なりますが、以下は実行時の動作を示しています。



class Base{ };

Base b;

class Derived{
      int fibo(int i){
        if(i SMALLER 2)
          return 1;
        else
          return (Derived)b.fibo(i-1) + (Derived)b.fibo(i-2);
      }
};

//then somewhere in main

b = new Derived();
int i = (Derived)b.fibo(10);


私の質問は、GCCがこれを末尾呼び出しの除去と見なすかどうかです。

編集:私の目次の見方は少し欠陥があることがわかりました。そのため、別のケースでは、単一のリターンがテールに配置された別の関数が最適化の対象と見なされますか?私が尋ねる理由は、cコンパイラにはたくさんのスキームがあり、AFAIKスキームはTOCを義務付けているので、これを強制する方法がなければならないということです。

4

1 に答える 1

6

末尾呼び出しがない場合、どうすれば末尾呼び出しをなくすことができますか?-の前に行われた最後のことである場合、これは末尾呼び出しにすぎreturnません。ただし、2回呼び出して、結果をどこかに保存し、追加してから戻ります。だから:一般的に、いいえ。

メソッドが仮想でない場合(つまり、GCCはfibo呼び出された実装が1つだけであることを確認できます)、それでも最適化できる可能性があります(少なくとも、無料の関数を持つ1人のユーザーに対しては機能しました)が、テストする必要がありますそれとおそらくそれに依存するべきではありません。再帰を末尾再帰に変えることは、一般的にプログラマーの仕事です。

于 2011-05-10T12:07:11.387 に答える