我想知道标准的Arduino环境是否支持尾部呼叫消除...... 有谁知道它的一些事情?
答案 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函数并编译它并查看生成的程序集。