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