5

標準のArduino環境が末尾呼び出しの除去をサポートしているかどうか疑問に思っていました...誰かがそれについて何か知っていますか?

4

2 に答える 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 に答える