簡體   English   中英

Arduino 是否支持尾調用消除?

[英]Does Arduino support tail call elimination?

我想知道標准的 Arduino 環境是否支持尾調用消除……有人知道嗎?

默認情況下,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 字節更多的嵌套調用。

大多數 C 編譯器不支持尾調用消除。 (該概念不在 C 標准中)。

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

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM