问题的标题可能有点奇怪,但事实是,据我所知,根本没有任何东西反对尾调用优化。然而,在浏览开源项目时,我已经遇到了一些积极尝试阻止编译器进行尾调用优化的函数,例如CFRunLoopRef的实现,它充满了这样的hacks。例如:
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
}
我很想知道为什么这看起来如此重要,是否有任何情况下我作为一个普通的开发人员也应该记住这一点?例如。尾调用优化有常见的陷阱吗?