У меня есть рекурсивная функция, которую я хотел бы сделать хвостом-рекурсивным. Моя фактическая проблема более сложна и зависит от контекста. Но проблема, которую я хотел бы решить, продемонстрирована с помощью этой простой программы:Хвост-рекурсия с объектами
#include <iostream>
struct obj
{
int n;
operator int&() { return n; }
};
int tail(obj n)
{
return tail(obj{ n + 1 > 1000 ? n - 1000 : n + 1 });
}
int main()
{
tail(obj{ 1 });
}
Кажется естественным, что это хвостовое рекурсивно. Это не так, потому что деструктор obj n
должен вызываться каждый раз. По крайней мере, MSVC13 (изменить :) и MSVC15 не оптимизируйте это. Если я заменил obj
на int и соответствующим образом изменил бы вызовы, он станет хвостовым рекурсивным, как ожидалось.
Мой фактический вопрос: есть ли простой способ сделать этот хвостовой рекурсивный, кроме замены obj
на int
? Я стремлюсь к преимуществам производительности, поэтому играть с выделенной памятью и new
, скорее всего, не поможет.
Самый простой способ: получить лучший компилятор, ваш устарел в любом случае ... –
msvc15 не делает этого, – IceFire
Как вы ожидаете, что эта хвостовая рекурсия закончится? –