Заголовок запитання може бути дещо дивним, але справа в тому, що, наскільки мені відомо, взагалі немає нічого, що могло б говорити проти оптимізації виклику хвоста. Однак, переглядаючи проекти з відкритим кодом, я вже натрапив на кілька функцій, які активно намагаються перешкодити компілятору виконувати оптимізацію хвостового виклику, наприклад, реалізація CFRunLoopRef, яка повна таких хаків . Наприклад:
static void __CFRUNLOOP_IS_CALLING_OUT_TO_AN_OBSERVER_CALLBACK_FUNCTION__() __attribute__((noinline));
static void __CFRUNLOOP_IS_CALLING_OUT_TO_AN_OBSERVER_CALLBACK_FUNCTION__(CFRunLoopObserverCallBack func, CFRunLoopObserverRef observer, CFRunLoopActivity activity, void *info) {
if (func) {
func(observer, activity, info);
}
getpid(); // thwart tail-call optimization
}
Я хотів би знати, чому це здається настільки важливим, і чи були випадки, коли б мені, як звичайному розробнику, теж слід було пам’ятати про це? Напр. чи є загальні підводні камені при оптимізації виклику хвоста?