为什么 noreturn/__builtin_unreachable 会阻止尾调用优化

2023-11-23

我发现,如果被调用函数不返回(即标记为_Noreturn/[[noreturn]]或者有一个__builtin_unreachable()通话后)。这是有意为之的行为,而不是错过的优化,如果是的话,为什么?

示例1:

#ifndef __cplusplus
#define NORETURN _Noreturn
#else
#define NORETURN [[noreturn]]
#endif

void canret(void);
NORETURN void noret(void);

void foo(void) { canret(); }
void bar(void) { noret(); }

C: https://godbolt.org/z/pJfEe- C++: https://godbolt.org/z/-4c78K

示例2:

#ifdef _MSC_VER
#define UNREACHABLE __assume(0)
#else
#define UNREACHABLE __builtin_unreachable()
#endif

void f(void);

void foo(void) { f(); }
void bar(void) { f(); UNREACHABLE; }

https://godbolt.org/z/PFhWKR


这是故意的,尽管可能存在争议,因为它会严重损害堆栈使用属性;出于这个原因,我什至欺骗编译器认为一个不能返回的函数可以。原因是许多 noreturn 函数是abort-喜欢(或者甚至打电话abort),并且运行调试器的人可能希望能够看到调用发生的位置——尾调用会丢失的信息。

引用:

  • https://gcc.gnu.org/bugzilla/show_bug.cgi?id=10837
  • https://gcc.gnu.org/bugzilla/show_bug.cgi?id=56165
  • https://gcc.gnu.org/bugzilla/show_bug.cgi?id=67327
  • etc.
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

为什么 noreturn/__builtin_unreachable 会阻止尾调用优化 的相关文章

随机推荐

  • wpf listview拖动选择多个项目

    只是想知道是否有人知道如何做到这一点 我想让用户通过单击并拖动鼠标来选择多个项目 不松开单击 假设用户单击第 1 项 然后向下拖动到第 10 项 项目 1 到 10 应该被选中 就像他单击项目 1 然后按住 Shift 键并单击项目 10
  • 如何快速更改颜色字典中图像中的像素?

    我有一个图像 我想从颜色图中更改图像中的所有颜色 例如 10 20 212 60 40 112 目前 我正在读取图像 OpenCV 然后迭代图像数组并更改每个像素 但这非常慢 有什么办法可以让我做得更快吗 我对这个问题提供两个答案 这个答案
  • PHP获取真实IP(代理检测)

    我确实可以跟踪用户的 真实 IP 如果他有一个发送真实 IP 标头的代理 是否有更好的解决方案 甚至更多标头 由于这个函数在脚本中经常使用 所以它必须非常快 而且它似乎不在那个星座中 我提出了一些建议 但无法实现 将标头按最 野外 使用的顺
  • Python re:在变量中存储多个匹配项

    我想匹配字符串的不同部分并将它们存储在单独的变量中以供以后使用 例如 string bunch oranges bananas apples rxp a z var1 var2 var3 这样我就有了 var1 oranges var2 b
  • Ruby:时间的平均数组

    我的方法中有以下方法Array class class Array def avg if partial include avg times else blank and 0 0 or sum to f size round 2 end e
  • MS 身份和访问工具 MVC 4

    这个 VS 2012 扩展旨在允许我将本地开发 STS 添加到我的 MVC 应用程序中http visualstudiogallery msdn microsoft com e21bf653 dfe1 4d81 b3d3 795cb1040
  • MongoDB - 使用 C# 驱动程序按日期和时间搜索

    您好 我想使用 MongoDB 的 C 驱动程序查找两个日期 带时间 之间的条目 但我使用的 Find Filter 方法会忽略时间并仅按日期搜索 我认为 我究竟做错了什么 My POCO public class TestClassFor
  • 使用 Gradle 运行 Karma?

    我有 Jasmine 单元测试 我想运行它并获取伊斯坦布尔代码覆盖率报告 我可以运行命令行脚本来在 Jenkins 中运行 Karma 但最好使用我的 build gradle 执行所有内容 是否可以使用 Gradle 运行 Karma 我
  • “异步”是否在单独的线程中运行? [复制]

    这个问题在这里已经有答案了 当我调用 foo 时 该方法是否在单独的线程上运行 public async Task
  • C# 中两个问号在一起意味着什么?

    遇到了这行代码 FormsAuth formsAuth new FormsAuthenticationWrapper 这两个问号是什么意思 是某种三元运算符吗 在谷歌上很难查到 它是空合并运算符 非常类似于三元 立即 if 运算符 也可以看
  • var myArray =[], 名称;?

    下面的语句中 name 有什么作用 var myArray name 我通常按 如下方式初始化数组 var myArray 它是简写 var myArray var name 这是关于个人喜好
  • 在树枝中循环并在三次迭代后中断

    我有以下树枝代码 for likeditem in user getItemLikes iterate over each liked items here endfor 但是我只想迭代前 3 项user getItemLikes 我该怎么
  • 与界面交互?

    从我读到的内容看来 人们可以与界面进行交互 例如 假设我有一个带有空方法 eat 的接口 然后有2个子类正在实现这个接口 我的控制器可以仅与界面交互并使用它的 eat 方法吗 看看这个链接中的图片strategy 除了访问其中定义的任何常量
  • 使用 Python 和 Numpy 创建原始图像的图像图块 (m*n)

    我正在使用 numpy 从 16 位 tiff 图像 13777 16004 创建 224 224 的图块 我能够沿着行和列裁剪 切片成 224 224 的相等图块 我在尝试创建新的图块时遇到了问题 移动图块大小的一半 例如 我想要实现的粗
  • Alamofire 与 -d

    我需要像邮递员那样提出请求 但是在阿拉莫菲尔 curl X DELETE http someUrl H authorization JWT someToken H cache control no cache H content type
  • 如何在 HTML 中将一个文本区域嵌入到另一个文本区域内?

    有没有办法将一个文本区域块嵌入另一个文本区域块内 但不渲染内部文本区域并保留外部文本区域 我无法修改内部文本区域 也许有比文本区域更适合外部块的东西 我需要一些可以在 POST 提交其内容的东西 将内部尖括号转换为实体是not一个选项 因为
  • tomcat安全约束影响缓存

    我在缓存我的应用程序时遇到问题 当此代码添加到 tomcat 的 web xml 时
  • Android - 如何获取 Spinner 中的所有项目?

    如何获得 Spinner 中的所有物品 我在尝试寻找一种方法来获取所有项目时遇到了麻烦Spinner但我无法找到一个优雅的解决方案 唯一的解决方案似乎是在将其添加到之前存储项目列表Spinner 还有其他更好的方法吗 一个简单而优雅的方法是
  • Android、Ormlite、数据库位置

    我正在使用 Ormlite 保存 Android 应用程序 在 Motorola Xoom 上运行 中的一些数据 默认情况下 sql数据库保存到 data data 包名 databases dbname db 问题是 Xoom 没有 ro
  • 为什么 noreturn/__builtin_unreachable 会阻止尾调用优化

    我发现 如果被调用函数不返回 即标记为 Noreturn noreturn 或者有一个 builtin unreachable 通话后 这是有意为之的行为 而不是错过的优化 如果是的话 为什么 示例1 ifndef cplusplus de