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