末尾呼び出しというコンパイラーの最適化によって、コールスタックにルーチンが見つからないことがあります。1 つの関数が別の関数を呼び出す場合、通常は、呼び出し先関数が復帰場所を特定できるように、呼び出し元関数が復帰アドレスと呼び出し元のレジスターをスタックに保存してから呼び出しを行います。呼び出し先関数用に新しいスタックフレームも作成されます。呼び出し元の最後の処理が呼び出し先を呼び出すことで、呼び出し先からの戻り値が呼び出し元の戻り値となる場合、コンパイラーは、呼び出しを呼び出し先への分岐またはジャンプに変更することがあります。これは、末尾呼び出しの最適化であり、呼び出し先から呼び出し元へ直接結果を返すことができるようになります。この場合、スタックは変更されず、呼び出し元関数のスタックフレームが再利用されるため、時間とスタック領域の節約になります。ただし、新しいフレームが追加されないため、スタックトレースにスタックフレームが見当たらず、デバッグに悪影響を及ぼすことがあります。