clang无限尾递归优化

2023-11-30

#include <iostream> 

int foo(int i){ 
     return foo(i + 1);
} 

int main(int argc,char * argv[]){ 
     if(argc != 2){ 
         return 1; 
     } 
     std::cout << foo(std::atoi(argv[1])) << std::endl; 
} 

% clang++ -O2 test.cc

% 时间 ./a.out 42

1490723512

./a.out 42 0.00s 用户 0.00s 系统 69% cpu 0.004 总计

% 时间 ./a.out 42

1564058296

./a.out 42 0.00s 用户 0.00s 系统 56% cpu 0.006 总计

% g++ -O2 测试.cc

% ./a.out 42 #无限递归

^C

% clang++ --version 
clang version 3.3 (tags/RELEASE_33/final) 
Target: x86_64-apple-darwin12.4.0 
Thread model: posix 
% g++ --version 
i686-apple-darwin11-llvm-g++-4.2 (GCC) 4.2.1 (Based on Apple Inc. build 5658) (LLVM build 2336.11.00) 
Copyright (C) 2007 Free Software Foundation, Inc. 
This is free software; see the source for copying conditions.  There is NO 
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. 

那么这是clang++的一个bug还是一个特性呢?


虽然 g++ 和 clang++ 都能够编译 C++98 和 C++11 代码,但 clang++ 从一开始就被设计为 C++11 编译器,并且在其 DNA 中嵌入了一些 C++11 行为(可以这么说) 。

在 C++11 中,C++ 标准变得可以感知线程,这意味着现在有一些特定的线程行为。特别是 1.10/24 规定:

该实现可能假设任何线程最终都会执行以下操作之一:

— 终止,

— 调用库 I/O 函数,

— 访问或修改易失性对象,或者

— 执行同步操作或原子操作。

[注意:这是为了允许编译器进行转换,例如删除空循环,即使无法证明终止也是如此。 ——尾注]

这正是 clang++ 在优化时所做的事情。它看到该函数没有副作用并将其删除even if它不会终止。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

clang无限尾递归优化 的相关文章

随机推荐

  • React 应用程序中的handleCategoryClick 和handleSearchChange 问题

    我正在开发一个 React 应用程序 我已经实现了两个功能 handleCategoryClick and handleSearchChange 分别处理类别选择和搜索功能 在登陆页面上 这两个功能都可以完美运行 但是 当导航到另一个页面时
  • Struts 2 和 Hibernate 中的异常处理

    假设我们用Struts 2 Hibernate MySQL开发了一个网站 并且我们添加了一些try catch这里的块包含通过 Hibernate 进行的数据库调用 我的问题是 在 catch 块内 我正在向记录器发送适当的消息 这里我们不
  • 仅 Spring-MVC 需要哪些 jar?

    我需要在我的临时项目中运行 Spring MVC 同时我有最小的内存区域来存储所有的 jar 文件 所以任何人推荐我只需要 Spring MVC 而不是任何其他 jar 文件 提前致谢 根据maven spring webmvc3 1 2需
  • 将 UIImage 从 BGR 转换为 RGB

    正如标题所示 我在某些 UIImage 颜色空间转换方面遇到了一些麻烦 TL DR 版本是我需要一种将 BGR 格式的 UIIMage 转换为 RGB 的方法 这是我的应用程序中的事件流程 应用程序 获取图像 应用程序 转换为base64并
  • 在汇编中操作字符串 (MASM)

    data source BYTE Defense mechanism 0 target BYTE SIZEOF source DUP 0 code main PROC mov esi OFFSET target mov edi OFFSET
  • 了解 ZeroMQ

    因此 正如我在上一篇文章中所问的那样 我希望能够使用不同语言编写的程序或函数在它们之间进行通信 我最近遇到了 Zeromq 我试图弄清楚这是否可以帮助我 因为它提供了某种套接字 例如 zeromq 可以在用 python 编写的程序与用 C
  • Laravel 保护 Amazon s3 存储桶文件

    我正在使用 Amazon s3 但在这里我面临两个问题 1 当我提交表单时 我无法直接将文件上传到亚马逊服务器 我的意思是我必须将图像上传到upload folder在我的 PHP 服务器上 我必须从那里检索它们并将其上传到s3 serve
  • 如何通过 JDBC-ODBC 桥在 MS Access 中指定 null 值?

    我无法使用 MS Access sun jdbc odbc JdbcOdbcDriver 在PreparedStatement 上调用 setNull preparedStatement setNull index sqltype 有解决方
  • 使用 SET 变量进行 MySQL 查询

    我试图通过在围绕单个值使用大量 case 语句运行查询之前设置一些变量来清理 Go 调用 MySQL 查询的方式 我尝试运行的查询在控制台上运行良好 但由于语法问题而失败SELECT当通过 Go 运行它时 这样的事情可能吗 func d D
  • Android - Google 地图扩展 - IllegalArgumentException

    当我调用 createMarker 方法时 出现 IllegalArgumentException private void createMarker GoogleMap map MarkerOptions options OnMarker
  • 如何将 xbf 文件添加到 Visual Studio 项目

    我已经为 Windows 通用平台 Win 10 UWP 创建了一个类库 该库包含一些用户控件 当我将此库中的 dll 添加到 Win 10 UWP 应用程序并使用 UserControls 时 它会给出 XamlParseExceptio
  • 如何在 Angular 5 的嵌套组件中使用 Flex 布局?

    我正在创建一个应用程序 该应用程序具有使用 Angular 5 中的父子关系的多个组件 在我的主 app component html 中 我有这个结构
  • 有或没有持有者的单例 = 惰性初始化 vs 急切初始化?

    它是否正确 Using a 带支架的单例给出延迟初始化 因为该类SingletonHolder仅在以下情况下初始化Singleton getInstance 正在运行 这依赖于SingletonHolder仅在内部被引用Singleton
  • FlashExternalInterface回调和JQuery滑块的IE SCRIPT16389错误

    我在使用 Internet Explorer 时遇到了一个非常奇怪的问题 在我的网站上 我使用 JQuery AnythingSlider 插件来显示一些视频 每当有人滑到下一个视频时 我都会收到一个快速回电 import flash ex
  • python中内置关键字type是指函数还是类?

    在大多数帖子中 人们经常说type如果提供一个参数 则它是一个内置函数 如果提供 3 个参数 则它是一个元类 But in python 的文档 签名type is class type object class type name bas
  • 完整的二叉树定义

    我对二叉树有一些疑问 维基百科指出二叉树是complete当 完全二叉树是这样的二叉树时 其中每个级别 可能除了最后一个级别 都被完全填充 并且所有节点都尽可能远离左侧 最后的 尽可能向左 这段话是什么意思 如果 1 它为空 或者 2 它的
  • 有什么方法可以配置AWS安全组以允许私有实例访问面向公众的负载均衡器?

    我有一个包含两个不同站点的网络应用程序 每个都可以通过 HTTP 访问 当您访问站点 1 时 它将直接为该站点提供服务 当您访问站点 2 时 它实际上会通过 REST API 调用在后台连接到站点 1 该架构如下图所示 显示的所有实例 蓝色
  • C# 使用不同类型的 System.Data.Linq.Tables 将变量设置为 var

    我有一个var并想要初始化它并经历switch case并设置变量var但它可以三种不同System Data Linq Tables lt gt dc是一个生成的DataClassesDataContext class 这是代码 var
  • 通过部分匹配名称来查找多个控件

    我目前有 100 多个标签 名称如下 labelNumber1 labelNumber2 labelNumber3 labelNumber4 labelLetter1 labelLetter2 labelLetter3 labelLette
  • clang无限尾递归优化

    include