我想知道标准的 Arduino 环境是否支持尾调用消除……有人知道吗?
问问题
312 次
2 回答
2
在 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 字节更多的嵌套调用。
于 2016-11-25T11:17:43.773 回答
0
大多数 C 编译器不支持尾调用消除。(这个概念不在 C 标准中)。
在非常有限的情况下,一些最近的 C 编译器可能支持它(仅在强优化时)。特别是 GCC(最新版本,如 4.6 或 4.7)。
您可以尝试一个简单的 C 函数并对其进行编译并查看生成的程序集。
于 2012-11-09T18:41:56.383 回答