Мне кажется, что было бы идеально работать для оптимизации хвостовой рекурсии как в C, так и в C ++, но при отладке я никогда не вижу стека фреймов, который указывает на эту оптимизацию. Это хорошо, потому что стек говорит мне, насколько глубока рекурсия. Тем не менее, оптимизация тоже была бы неплоха.
Какие-нибудь компиляторы C ++ выполняют эту оптимизацию? Зачем? Почему нет?
Как мне сказать компилятору сделать это?
- Для MSVC:
/O2
или /Ox
- Для GCC:
-O2
или -O3
Как насчет проверки, если компилятор сделал это в определенном случае?
- Для MSVC включите вывод PDB, чтобы иметь возможность отслеживать код, затем проверьте код
- Для GCC ..?
Я бы по-прежнему принимал предложения о том, как определить, оптимизирована ли определенная функция, подобная этой, компилятором (хотя я нахожу это заверением, что Конрад говорит мне принять это)
Всегда можно проверить, делает ли это компилятор вообще, выполняя бесконечную рекурсию и проверяя, приводит ли это к бесконечному циклу или переполнению стека (я сделал это с GCC и обнаружил, что -O2
достаточно) , но я хочу иметь возможность проверить определенную функцию, которая, как я знаю, в любом случае завершится. Я хотел бы иметь простой способ проверить это:)
После некоторого тестирования я обнаружил, что деструкторы разрушают возможность этой оптимизации. Иногда может стоить изменить область видимости определенных переменных и временных значений, чтобы убедиться, что они выходят за пределы области действия до начала оператора return.
Если после хвостового вызова требуется запустить деструктор, оптимизация хвостового вызова не может быть выполнена.