Обычно компиляторы распознают ситуации, когда функции не нужно ничего делать после вызова другой, и заменяют этот вызов переходом. Многие случаи, когда это можно сделать безопасно, легко распознать, и такие случаи можно квалифицировать как «безопасный низко висящий фрукт». Однако даже для компиляторов, которые могут выполнять такую оптимизацию, не всегда может быть очевидно, когда она должна или будет выполняться. Различные факторы могут сделать стоимость хвостового вызова большей, чем стоимость обычного вызова, и эти факторы не всегда могут быть предсказуемыми. Например, если функция заканчивается на return foo(1,2,3,a,b,c,4,5,6);
, может оказаться целесообразным скопировать a, b и c в регистры, очистить стек и затем подготовить аргументы для передачи, но может быть недостаточно регистров, доступных для обработки foo(a,b,c,d,e,f,g,h,i);
аналогично.
Если бы язык имел специальный синтаксис "хвостового вызова", который требовал, чтобы компиляторы давали задание, которое делает хвостовой вызов, если это вообще возможно, и отказывалось от компиляции в противном случае, код мог бы смело предполагать, что такие функции могут быть вложены сколь угодно глубоко. Однако при использовании обычного синтаксиса вызова нет общего способа узнать, сможет ли компилятор выполнить хвостовой вызов дешевле, чем «обычный».