问题的标题可能有点奇怪,但据我所知,根本没有什么可以反对尾部调用优化。但是,在浏览开源项目时,我已经遇到了一些主动尝试阻止编译器进行尾部调用优化的功能,例如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
}
我很想知道为什么这看起来如此重要,并且在任何情况下我作为普通开发人员都应该牢记这一点吗?例如。尾部调用优化存在常见的陷阱吗?