这个问题的标题可能有些奇怪,但据我所知,没有任何反对尾递归优化的说法。然而,在浏览开源项目时,我已经遇到过一些旨在阻止编译器进行尾递归优化的函数,例如实现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
}
我想知道为什么这似乎如此重要,是否有任何情况下作为一个“普通”的开发人员也应该注意?例如,尾递归优化是否存在常见的陷阱?
getpid()
的返回值未被使用,一个明智的优化器是否可以将其移除(因为已知getpid()
是一个没有副作用的函数),从而允许编译器进行尾调用优化?这似乎是一种非常脆弱的机制。 - luiscubal