Как рекурсивная функция может быть inline ?
От: Forrest_Gump  
Дата: 15.02.04 23:12
Оценка:
Бьерн Страуструп "Язык программирования С++" 3-е издание, стр. 186, п. 7.1.1 "Определения функций".
Сначала приводится пример:

inline int fac(int n) {return (n < 2) ? 1 : n * fac(n-1); }

а потом написано следующее:

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


Поясните, пожалуйста, КАК рекурсивная функция вообще может быть встраиваемой ?
Каким же будет тогда механизм её вызова ?

Кстати, в Visual C++ 6 SP5 я создал такой файл:

inline int fac(int n) {return (n < 2) ? 1 : n * fac(n-1); }

int main(){
    fac(6);

    return 0;
}

И, дизассемблер показывает вот что:

2:
3:    int main(){
00401020   push        ebp
00401021   mov         ebp,esp
00401023   sub         esp,40h
00401026   push        ebx
00401027   push        esi
00401028   push        edi
00401029   lea         edi,[ebp-40h]
0040102C   mov         ecx,10h
00401031   mov         eax,0CCCCCCCCh
00401036   rep stos    dword ptr [edi]
4:        fac(6);
00401038   push        6
0040103A   call        @ILT+5(fac) (0040100a)
0040103F   add         esp,4
5:
6:        return 0;
00401042   xor         eax,eax
7:    }

То есть встраивания не произошло, как я и ожидал

P.S. Быть может, это не такая уж и серьёзная и часто возникающая проблема, но я задался целью прочесть всего Страуструпа, поэтому не хотелось бы, чтобы у меня оставались "белые пятна".
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.