【问题标题】:Does Arduino support tail call elimination?Arduino 是否支持尾调用消除?
【发布时间】:2012-11-09 18:39:41
【问题描述】:

我想知道标准 Arduino 环境是否支持尾调用消除... 有人知道吗?

【问题讨论】:

  • 这就像是在问“PC 是否支持尾调用消除?” - 你问的是错误的组件。您应该询问特定的编译器。
  • @Damien_The_Unbeliever:他问的是标准 Arduino 环境,这可能隐含地指的是精确的编译器。

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


【解决方案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 字节更多的嵌套调用。

【讨论】:

    【解决方案2】:

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

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

    您可以尝试一个简单的 C 函数并对其进行编译并查看生成的程序集。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-04-09
      • 2017-07-23
      • 1970-01-01
      • 2015-12-29
      • 1970-01-01
      • 2016-10-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多