【发布时间】:2012-06-03 04:19:27
【问题描述】:
问题的标题可能有点奇怪,但问题是,据我所知,根本没有任何内容反对尾调用优化。但是,在浏览开源项目时,我已经遇到了一些积极尝试阻止编译器进行尾调用优化的函数,例如 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
}
我很想知道为什么这看起来如此重要,有没有我作为一个普通开发人员也应该记住这一点的情况?例如。尾调用优化有哪些常见的陷阱?
【问题讨论】:
-
一个可能的陷阱可能是应用程序在多个平台上运行顺畅,然后在使用不支持尾调用优化的编译器编译时突然停止工作。请记住,这种优化实际上不仅可以提高性能,还可以防止运行时错误(堆栈溢出)。
-
@NiklasB。但这难道不是不尝试禁用它的理由吗?
-
系统调用可能是降低 TCO 的可靠方法,但也是一种相当昂贵的方法。
-
这是一个很好的教学时刻,可以进行适当的评论。 +1 用于部分解释为什么该行存在(以防止尾调用优化),-100 用于不解释为什么需要首先禁用尾调用优化...
-
由于
getpid()的值没有被使用,它不能被知情的优化器删除(因为getpid是一个已知没有副作用的函数),因此允许编译器无论如何都要进行尾调用优化?这似乎是一个真的脆弱的机制。
标签: c++ c optimization compiler-optimization tail-call-optimization