Полагаю, ваш друг пытался сказать, что, если ему дать константу, компилятор может полностью вычислить результат во время компиляции и просто вставить ответ на сайте вызова. C ++ 0x на самом деле имеет механизм для этого, называемый constexpr
, но существуют ограничения на то, насколько сложным может быть код. Но даже с текущей версией c ++ это возможно. Это полностью зависит от компилятора.
Эта функция может быть хорошим кандидатом, поскольку она явно ссылается только на параметр для вычисления результата. Некоторые компиляторы даже имеют непереносимые атрибуты , чтобы помочь компилятору решить это. Например, gcc имеет атрибуты pure
и const
(перечисленные на той странице, на которую я только что ссылался), которая сообщает компилятору, что этот код работает только с параметрами и не имеет побочных эффектов, что повышает вероятность его вычисления во время компиляции. .
Даже без этого он все равно будет компилироваться! Причина в том, что компилятору разрешено не включать функцию, если он решит. Думайте о встроенном ключевом слове скорее как о предложении, чем о инструкции.
Предполагая, что компилятор не вычисляет все это во время компиляции, встраивание невозможно полностью без других примененных оптимизаций ( см. РЕДАКТИРОВАТЬ ниже ), поскольку он должен иметь фактическую функцию для вызова. Тем не менее, он может стать частично встроенным. В этом случае компилятор встроит начальный вызов, но также выдаст обычную версию функции, которая будет вызываться во время рекурсии.
Что касается вашего второго вопроса, то да, размер - это один из факторов, который компиляторы используют для принятия решения о целесообразности включения чего-либо.
Если запуск этого кода на вашем ноутбуке занимает очень много времени, возможно, вы просто задали ему очень большие значения, и просто требуется много времени для вычисления ответа ... Код выглядит хорошо, но продолжайте Имейте в виду, что значения выше 13!
будут переполнены 32-битным int
. Какое значение вы пытались передать?
Единственный способ узнать, что на самом деле происходит, - это скомпилировать его и посмотреть на сгенерированную сборку.
PS: вы можете заглянуть в более современный компилятор, если вас интересует оптимизация. Для Windows есть MingW и бесплатные версии Visual C ++. Для * NIX, конечно, есть g ++.
РЕДАКТИРОВАТЬ : Существует также вещь, называемая Оптимизация рекурсии хвоста , которая позволяет компиляторам преобразовывать определенные типы рекурсивных алгоритмов в итеративные, что делает их лучшими кандидатами для встраивания. (В дополнение к повышению эффективности стека).