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