Я наблюдал за сборкой основных компиляторов, с максимальной оптимизацией у вас не должно быть переполнения стека:
- GCC : упростить функцию до 0, рекурсии нет.
- Clang : как GCC
- MSVC : выполнить рекурсивный вызов с внутренним переходом (вид хвостового вызова), только аргументпервый нерекурсивный вызов помещается в стек.
Так что я думаю, у вас не будет переполнения стека, если вы включите оптимизацию для этого тривиального случая.
Но я предполагаю, что ваш случайболее сложный.
Если у вас была функция, которая не вызывала переполнения стека без какой-либо статической переменной, а затем вызывала переполнение стека, если вы добавили эту статическую переменную, причина, вероятно, является побочным эффектом при генерации кода статической переменной.инициализация.
Инициализация статической переменной защищена своего рода «мьютексом», чтобы гарантировать, что статическая переменная инициализируется только один раз в многопоточной программе.м.Эти мьютексы вызывают вызов библиотечных функций.Перед вызовом функции компилятор должен убедиться, что сохраненный вызывающий, неиспользуемый регистр аргументов и сохраненный регистр вызываемого абонента (который он не будет использовать) сохраняются при вызовах.Для этого компилятор может поместить значения регистров в стек.
Таким образом, даже если инициализация статической переменной происходит только один раз в потоке программы, ее простое существование может радикально изменить сгенерированный код.