Я полагаю, ваш друг пытается сказать, что если задана константа, компилятор может вычислить результат полностью во время компиляции и просто встраивать ответ на месте вызова. C++ 0x на самом деле имеет механизм для этого, который называется constexpr
, но существуют ограничения на то, насколько сложным может быть код. Но даже с текущей версией C++ это возможно. Это полностью зависит от компилятора.
Эта функция может быть хорошим кандидатом, учитывая, что она явно ссылается только на параметр для вычисления результата. Некоторые компиляторы даже имеют non-portable attributes, чтобы помочь компилятору решить это. Например, gcc имеет атрибуты pure
и const
(перечисленные на той странице, которую я только что связал), которые сообщают компилятору, что этот код работает только с параметрами и не имеет побочных эффектов, что делает его более вероятным для вычисления во время компиляции.
Даже без этого он все равно будет скомпилирован! Причина в том, что компилятору разрешено не встроить функцию, если она решит. Подумайте о ключевом слове inline больше предложения, чем инструкции.
Предполагая, что компилятор не вычисляет все это во время компиляции, вложение не возможно полностью без применения других оптимизаций (см. EDIT ниже), поскольку он должен иметь действительную функцию для вызова. Однако это может быть частично включено. В этом случае компилятор будет вставлять начальный вызов, но также испускает регулярную версию функции, которая будет вызвана во время рекурсии.
Что касается вашего второго вопроса, да, размер является одним из факторов, которые используют компиляторы, чтобы решить, подходит ли оно для встроенного.
Если этот код на вашем ноутбуке занимает очень много времени, то возможно, что вы просто дали ему очень большие значения, и это просто занимает много времени, чтобы рассчитать ответ ... Код выглядит нормально, но имейте в виду, что значения выше 13!
собираются переполнить 32-разрядный int
. Какую ценность вы пытались пройти?
Единственный способ узнать, что на самом деле происходит, - это скомпилировать его для сборки.
PS: вы можете захотеть изучить более современный компилятор, если вы заинтересованы в оптимизации. Для окон есть MingW и бесплатные версии Visual C++. Для * NIX есть, конечно, g ++.
EDIT: Существует также, что называется Tail Recursion Optimization, который позволяет составителям преобразовать определенные типы рекурсивных алгоритмов итеративной, что делает их более кандидатов на встраивание. (В дополнение к тому, что они делают больше пространства стека эффективным).
'inline' делает две вещи. Он позволяет определять функцию более одного раза (при условии, что определения одинаковы), и намекает, что компилятор должен встроить эту функцию. Второе использование полностью устарело, поскольку компилятор проигнорирует его и может встроить строки, не отмеченные в строке, а не встроенные строки, помеченные как встроенные (как и должно быть, поскольку он знает намного лучше, что должно быть вложенным). Но помимо тех, это все еще только функция, ничего больше не изменилось. Назовите функцию 'factorial' вместо' f', скомпилируйте с оптимизацией и не вводите ничего слишком большого с рекурсивной функцией. – GManNickG
Кроме того, этот компилятор ужасно старый, вы хотите перейти к более новому. GCC является бесплатным (и MinGW является бесплатным), а также версия Express Visual Studio. – GManNickG
это не мой ответ. Если у вас есть четкое представление о моем вопросе, то, пожалуйста, дайте ответ. – userBI