6

だが、私はこのような単純な機能を持っているとしましょう:次のようにで短絡演算子と末尾再帰

int all_true(int* bools, int len) { 
    if (len < 1) return TRUE; 
    return *bools && all_true(bools+1, len-1); 
} 

この機能は、より明らかに末尾再帰形式に書き換えることができます。

int all_true(int* bools, int len) { 
    if (len < 1) return TRUE; 
    if (!*bools) return FALSE; 
    return all_true(bools+1, len-1); 
} 

論理的には、この2つの間にはゼロ差があります。 boolsにはTRUEまたはFALSEしか含まれていないと仮定すると、まったく同じことを行います。

私の質問です:コンパイラは末尾再帰呼び出しのような第2の最適化をするために十分にスマートであるならば、それは「& &」短絡ことを考えると、それは同じように最初を最適化することを期待するのが妥当でしょうか?明らかに、非短絡演算子が使用された場合、ではなくはテール再帰となります。両方の式は演算子が適用される前に評価されるためですが、短絡したケースが不思議です。

(私は、Cコンパイラが通常はテール再帰呼び出しを最適化しないという洪水を受ける前に、言語に関係なく、短絡演算子による末尾再帰呼び出しの最適化に関する一般的な質問と考えてください。私はスキーム、ハスケル、OCaml、F#、Python、またはあなたがCを理解していない場合はあなたのために他に何があったかを書き直して幸せになるでしょう)

+0

gccは再帰呼び出しを最適化します。 – Arafangion

答えて

2

あなたの質問は本当にどのようにスマートですコンパイラ? "どのコンパイラを使用しているかは記述していません。

タイプに便利な、ほとんどいない状態で最適化する前に仲介フローグラフにソースコードを変換し、仮想的な合理的なコンパイラを考えると、あなたが書いたコードの両方のフラグメントは、(同じように& &演算子を表すことができますコンパイラは&という具合にコンパイルされているので、仮想コンパイラの1つのフェーズで展開されると驚くことはありません)。その前提では、あなたの質問に対する答えが「はい」であると主張するのは合理的です。

しかし、実際にこれに頼っているのであれば、使用しているコンパイラを使ってテストしてください。

関連する問題