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