inline int plusOne(int n){
return n+1;
}
/*...*/
int k=5;
cout << plusOne(k);
Компилятор заменит plusOne(k) на (k+1), подставив k вместо n в определении функции. Рассмотрим более интересный пример:
//рекурсивное вычисление факториала:
inline int fact(int n){
return n!=1 ? n*fact(n-1) : 1;
}
/*...*/
cout << fact(3);
Действия компилятора с этим выражением по шагам:
- cout << (3!=1 ? 3*fact(3-1) : 1); //заменил вызов определением
- cout << 3*fact(2); //наш компилятор не дурак - упростил выражение
- cout << 3*(2!=1 ? 2*fact(2-1) : 1); //заменил
- cout << 6*fact(1); //упростил
- cout << 6*(1!=1 ? 1*fact(1-1) : 1); //вызов fact уже не нужен, так как условие не выполняется.
- cout << 6;
Теперь такое выражение:
cout << fact(100);
Что будет делать компилятор? Заменять вызов 100 раз? А если написать fact(1000)? А если так:
int k;
cin >> k;
cout << fact(k);
Опять рассмотрим по шагам:
- cout << (k!=1 ? k*fact(k-1) : 1); //Это уже не упростить. Ладно, заменим fact(k-1)
- cout << (k!=1 ? k*(((k-1)!=1 ? (k-1)*fact(k-2) : 1)) : 1); //Нда... Продолжаем?
- cout << (k!=1 ? k*(((k-1)!=1 ? (k-1)*(((k-2)!=1 ? (k-2)*fact(k-3) : 1)) : 1)) : 1);
Ну все-все, хватит. Компилятор тоже не будет долго церемониться. Если глубина замен вызовов слишком велика, он плюнет на inline, и оставит вызов функции без замены.
Комментариев нет:
Отправить комментарий
Можно использовать теги <b>, <i>