Arduino是否支持尾部呼叫消除?

时间:2012-11-09 18:39:41

标签: c arduino tail-recursion tail-call-optimization tail-call

我想知道标准的Arduino环境是否支持尾部呼叫消除...... 有谁知道它的一些事情?

2 个答案:

答案 0 :(得分:1)

Arduino IDE中默认支持并启用了尾部调用消除功能。这对于微控制器领域来说是非常标准的,其中为了内存效率而牺牲了适当的堆栈帧等调试辅助工具。

这是一个测试:

const int RAM_SIZE_IN_BYTES = 2048;

void f(int i) {
  Serial.println(i);
  if(i == 0) return;
  else f(i-1);
}

void setup() {
  Serial.begin(9600);
  f(RAM_SIZE_IN_BYTES);
}

void loop() {
}

此代码将2048到0的数字打印到控制台,这需要比可用RAM字节更多的递归调用。

答案 1 :(得分:0)

大多数C编译器不支持尾部调用消除。 (这个概念不符合C标准)。

最近的一些C编译器可能会支持它(仅在强烈优化时),在非常有限的情况下。特别是GCC(最新版本如4.6或4.7)。

你可以尝试一个简单的C函数并编译它并查看生成的程序集。