2015-09-10 10 views
5

スカラになって以来、私はテール再帰を使用して関数を書くことを始め、C++コンパイラもそれをサポートし、テール再帰関数も最適化することを学びました。今、私は、最適化がどれほど確実であるかについて興味があり、メインループやコマンドプロンプトなどのためにそれを使用するのは大丈夫ですか?Scala/C++:入力ループではなくテール再帰関数

伝統的に、私はコマンドを書いたが、このように求められます:

bool running = true; 
string input; 
while(running_){ 
    input = getInput(); 
    executeCommand(input); 
    if(input == "quit") running_ = false; 
} 

今では、このような尾再帰関数でこれを置き換えるために悪いことでしょうか?

string input = "nothing"; 
void parseInput(){ 
    if(input != "nothing") executeCommand(input); 

    getline(cin, input); 
    if(input != "quit") parseInput(); 
} 
+0

素晴らしいアイデア! – UmNyobe

答えて

2

異なるコンパイラによって異なるレベルの信頼性でTCO(テールコール最適化)が適用されます。あなたの特定のケースでは、ブランチ内の呼び出しの直後に戻りませんので、コンパイラにとってさらに難しくなります。コンパイラは、呼び出しが完了した後に実行されるコードがないことを確認するために、追加のステップを踏まなければなりません。

TCOが発生したことを確認するには、親友に頼らざるを得ません。あなたの親友はasm出力です。

+0

'if(input!=" quit ")thisFunction();を書けば、コンパイラに優しいでしょうか?そうでなければcout << "bye!\ n"; '? – BigBadWolf

+0

@BigBadWolf、thisFunctionの呼び出しの直後に分岐内に戻ります。 – SergeyA

関連する問題