Tytuł pytania może być trochę dziwny, ale chodzi o to, że o ile wiem, nic nie przemawia przeciwko optymalizacji wywołań ogonowych. Jednak podczas przeglądania projektów open source natknąłem się już na kilka funkcji, które aktywnie próbują powstrzymać kompilator przed optymalizacją wywołań ogonowych, na przykład implementację CFRunLoopRef, która jest pełna takich hacków . Na przykład:
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
}
Bardzo chciałbym wiedzieć, dlaczego wydaje się to tak ważne, i czy są jakieś przypadki, w których ja jako normalny programista też powinienem pamiętać? Na przykład. czy są typowe pułapki związane z optymalizacją wywołań ogonowych?