Может ли рекурсивная функция быть встроенной?

Действительно, если ваш компилятор cxx не действует разумно, он compiler может попытаться рекурсивно compiler-construction вставить копии вашей функции c inlined, создавая бесконечно большой compiler-construction код. Однако большинство современных compiler-design компиляторов распознают это. Они compiler могут либо:

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

Для случая 2 многие compiler компиляторы имеют #pragma, которые compiler-design вы можете установить, чтобы cxx указать максимальную глубину, до compiler-design которой это должно быть сделано. В cpp gcc вы также можете передать c++ это из командной строки с c++ помощью --max-inline-insns-recursive (см. дополнительную cpp информацию here).

c++

c

compiler-construction

2022-03-31T01:37:51+00:00