Оптимизация Tail Call GCC для следующей ситуации - PullRequest
2 голосов
/ 10 мая 2011

Ниже приведен фрагмент кода, который программно генерируется для игрушечного языка программирования, фактический код другой, но ниже показано, что он делает при выполнении,



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, поэтому должен быть способ форсировать это?

1 Ответ

6 голосов
/ 10 мая 2011

Как можно устранить хвостовой вызов, если не существует хвостовой вызов?Это только хвостовой вызов, если это самое последнее, что было сделано до return - но вы вызываете его дважды, где-то сохраняете результаты, добавляете их и , затем вы возвращаете.Итак: Как правило, нет.

Если метод не является виртуальным (т. Е. GCC может быть уверен, что вызывается только одна реализация fibo), он может все еще сможет его оптимизировать(по крайней мере, это работало для одного пользователя с бесплатной функцией ), но вам придется протестировать его и, вероятно, не следует полагаться на него.Превращение рекурсии в хвостовую рекурсию обычно является работой программиста.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...