我知道它是什么了。我的问题是:
1.)如果我编写的代码可以进行尾部调用优化(函数中的最后一条语句递归函数只是一个函数调用,没有其他操作),那么我是否需要设置任何优化级别,以便编译器执行TCO。编译器将在哪种优化模式下执行TCO、空间或时间优化器。
2.)如何找出哪些编译器(MSVC、gcc、ARM-RVCT)支持TCO
3.)假设一些编译器做了TCO,那么我们启用它,那么怎样才能发现编译器实际上已经做了TCO呢?代码大小,告诉它,或者执行它所花费的周期将会告诉你这一点,还是两者都有?
-AD
发布于 2008-11-22 13:29:03
大多数编译器都支持TCO,这是一种相对较旧的技术。至于如何在特定的编译器中启用它,请查看编译器的文档。除了-O1,gcc会在每个优化级别都启用优化,我认为具体的选项是-foptimize-sibling-calls。至于如何判断编译器是否正在执行总拥有成本,请查看汇编程序输出(例如gcc -S)或反汇编目标代码。
发布于 2008-11-22 13:29:42
发布于 2008-11-22 13:28:33
如果希望编译器进行尾部调用优化,只需选中
a)将在哪个优化级别执行的编译器文档,或者
b)检查asm,看函数是否会调用自己(你甚至不需要很强的asm知识就能再次发现函数的符号)
如果你真的想要尾递归,我的问题是:
你为什么不自己执行删除尾部调用呢?这只意味着移除递归,如果它是可移除的,那么不仅可以由底层的编译器,也可以由你在算法层面上,你可以将它直接编程到你的代码中(这意味着除了循环,而不是对自己的调用)。
https://stackoverflow.com/questions/311332
复制相似问题