Что означает "родственные вызовы"?

В руководстве GCC,

-foptimize-одноуровневых-звонки

Оптимизируйте речевые вызовы с сестрой и хвостом.

Я знаю хвостовые рекурсивные вызовы, например

int sum (int n) {return n == 1? 1: n + sum (n-1); }

Однако, что означают вызовы братьев и сестер?

Ответ 1

Это должно быть примерно так:

int ispair(int n) { return n == 0 ? 1 : isodd(n-1); }
int isodd(int n) { return n == 0 ? 0 : ispair(n-1); }

В общем случае, если вызов функции является последним предложением, то его можно заменить прыжком.

void x() { ......; y(); }

В этом случае y() можно заменить скачком (или встроенной функцией) вместо использования стандартного вызова функции.

Ответ 2

компилятор рассматривает две функции как братьев и сестер, если они имеют одинаковые структурная эквивалентность типов возврата, а также совмещение пространства требования их аргументов.

http://www.drdobbs.com/tackling-c-tail-calls/184401756