这个问题的标题可能有点奇怪,但问题是,据我所知,根本没有任何东西反对尾部调用优化.然而,在浏览开源项目时,我已经遇到了一些主动try 阻止编译器进行尾部调用优化的函数,例如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
}
我很想知道为什么这看起来如此重要,有没有什么情况是我作为一个normal开发人员也应该记住这一点的?例如.尾部调用优化有没有常见的trap ?