El título de la pregunta puede ser un poco extraño, pero la cuestión es que, hasta donde yo sé, no hay nada que hable en absoluto en contra de la optimización de llamadas finales. Sin embargo, mientras navegaba por proyectos de código abierto, ya me encontré con algunas funciones que intentan activamente evitar que el compilador realice una optimización de llamadas finales , por ejemplo, la implementación de CFRunLoopRef, que está llena de tales trucos . Por ejemplo:
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
}
Me encantaría saber por qué esto es aparentemente tan importante, y ¿hay algún caso en el que yo, como desarrollador normal, deba tener esto en cuenta también? P.ej. ¿Existen errores comunes con la optimización de llamadas de cola?