首页 / 知识
哪个(如果有的话)C ++编译器会进行尾递归优化?
2023-04-13 14:30:00

Which, if any, C++ compilers do tail-recursion optimization?在我看来,在C和C ++中进行尾递归优化是完美的,但是在调试时我似乎永远不会看到表示此优化的帧堆栈。这有点好,因为堆栈告诉我递归的深度。但是,优化也会很好。 是否有任何C ++编译器进行此优化?为什么?为什么不? 我如何告诉编译器这样做?
如何在某种情况下检查编译器是否已完成此操作?
我仍然会建议如何确定编译器是否对某个函数进行了优化(尽管我发现它让人放心,Konrad告诉我假设它)
总是可以通过进行无限递归来检查编译器是否完成此操作,并检查它是否导致无限循环或堆栈溢出(我用GCC做了这个并发现 经过一些测试,我发现析构函数破坏了进行优化的可能性。有时可能值得更改某些变量和临时值的范围,以确保它们在return语句开始之前超出范围。 如果在尾调用后需要运行任何析构函数,则无法进行尾调用优化。 所有当前的主流编译器都能很好地执行尾调优化(并且已经完成了十多年),即使对于相互递归的调用,例如:
让编译器进行优化非常简单:只需开启优化速度:
检查编译器是否进行优化的一种简单方法是执行一个调用,否则会导致堆栈溢出 - 或者查看程序集输出。 作为一个有趣的历史记录,在Mark Probst的毕业论文中,C的尾调优化被添加到GCC。论文描述了实施中的一些有趣的警告。值得一读。
gcc 4.3.2将此函数(crappy / trivial
除了显而易见之外(编译器不会进行这种优化),C ++中的尾调用优化存在一个复杂性:析构函数。 给出如下内容:
编译器不能(通常)尾调用优化它,因为它需要 有时编译器可以看到析构函数没有外部可见的副作用(因此可以尽早完成),但通常不能。
其中特别常见的形式是 大多数编译器在调试版本中不进行任何类型的优化。 如果使用VC,请尝试打开PDB信息的版本构建 - 这将允许您跟踪优化的应用程序,您应该希望看到您想要的。但请注意,调试和跟踪优化的构建将使您四处奔走,并且通常无法直接检查变量,因为它们只会在寄存器中结束或完全被优化掉。这是一次"有趣"的体验...... 正如Greg所提到的,编译器不会在调试模式下执行此操作。调试版本比prod版本更慢,但它们不应该更频繁地崩溃:如果你依赖于尾部调用优化,它们可能就是这样做的。因此,通常最好将尾调用重写为普通循环。 :-( |
最新内容
相关内容
linux保留堆栈命令?
linux保留堆栈命令?,地址,工作,系统,信息,管理,命令,目录,代码,名称,连续,linux系统常用操作命令linux常用命令有pwd命令、cd命令、ls命令、calinux调试终端命令?
linux调试终端命令?,系统,工作,地址,首页,电脑,终端,命令,标准,信息,基础,求Linux操作系统的一些终端命令,多谢。linux系统常用操作命令linuxlinux脚本调试的命令?
linux脚本调试的命令?,工作,系统,管理,命令,地址,标准,脚本,底部,代码,官网,linux下shell脚本命令shell变量调出命令。linux中的shell脚本有多linux进入编译器命令?
linux进入编译器命令?,系统,代码,环境,网上,基础,工作,工具,信息,时间,地址,linux终端下如何进行C语言编译1、在Linux下面,如果要编译一个C语言linux命令调试模式?
linux命令调试模式?,系统,工作,信息,地址,工程,命令,工具,环境,设备,地方,linux下如何使用gdb调试gdb test 进入调试需要调试的地方打下断点,rulinux调试驱动的命令?
linux调试驱动的命令?,系统,网络,官网,百度,地址,下来,第一,官方网站,软件,情况,linux下安装编译网卡驱动的方法1、网卡相关的TCP/IP网络配置linux命令调试过程?
linux命令调试过程?,代码,通用,地方,信息,系统,程序,进程,命令,编辑,断点,如何使用linux下gdb来调试python程序1、gdb是用来调试二进制程序的,如何优化 Python
如何优化 Python,代码,项目,情况,在线,技术,电脑,大规模,合法,策略,培训,我最喜欢Python的一点就是它可以让你一步一步地优化你的代码。比如python调试的几种方式
python调试的几种方式,代码,位置,信息,状态,培训,数据,分析,变量,函数,方式,python作为一种脚本语言,很多时候我们习惯于它的简洁,习惯于它的修优化 Python 程序的内存占用
优化 Python 程序的内存占用,代码,数据,情况,培训,对象,字典,内存,垃圾,程序,机制,Python的垃圾回收机制通过引用计数来决定一个对象要不要被如何提速优化python代码?
如何提速优化python代码?,代码,时间,数据,新增,写法,包装,情况,下来,面临,工作,Python是一种脚本语言,相比C/C++这样的编译语言,在效率和性能方python 编译器
python 编译器,代码,培训,统一,异常,对象,字节,文件,编译器,类型,结果,执行pythondemo.py后,将会启动Python的解释器,然后将demo.py编译成一个