gpt4 book ai didi

c++ - 为什么代码会主动尝试阻止尾调用优化?

转载 作者:IT老高 更新时间:2023-10-28 12:03:18 25 4
gpt4 key购买 nike

问题的标题可能有点奇怪,但问题是,据我所知,根本没有任何内容反对尾调用优化。然而,在浏览开源项目时,我已经遇到了一些积极尝试阻止编译器进行尾调用优化的函数,例如 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
}

我很想知道为什么这看起来如此重要,我作为一个普通开发人员是否也应该记住这一点?例如。尾调用优化有哪些常见的陷阱?

最佳答案

我的猜测是,这是为了确保 __CFRUNLOOP_IS_CALLING_OUT_TO_AN_OBSERVER_CALLBACK_FUNCTION__ 在堆栈跟踪中以进行调试。它有 __attribute__((no inline)) 支持这个想法。

如果您注意到,该函数无论如何都会跳到另一个函数,所以它是一种蹦床形式,我只能认为它具有如此冗长的名称来帮助调试。这将特别有用,因为该函数正在调用已从其他地方注册的函数指针,因此该函数可能无法访问调试符号。

还要注意其他类似名称的函数,它们执行类似的操作 - 它看起来确实可以帮助查看回溯中发生的情况。请记住,这是核心 Mac OS X 代码,也会显示在崩溃报告和处理示例报告中。

关于c++ - 为什么代码会主动尝试阻止尾调用优化?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10790737/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com