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