2012-11-09 46 views
4

我想知道標準的Arduino環境是否支持尾部呼叫消除... 有沒有人知道它的一些事情?Arduino是否支持尾部呼叫消除?

+1

這就像問「PC是否支持尾部呼叫消除?」 - 你問的是錯誤的組件。你應該問一個特定的編譯器。 –

+3

@Damien_The_Unbeliever:他詢問*標準的Arduino環境*,這可能暗指一個精確的編譯器。 –

回答

0

大多數C編譯器不支持尾部呼叫消除。 (該概念不在C標準中)。

一些最近的C編譯器可能會支持它(只有在強烈優化時),在非常有限的情況下。特別是GCC(最新版本如4.6或4.7)。

您可以嘗試一個簡單的C函數並編譯它並查看生成的程序集。

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字節。