Когда я не могу встроить функцию?

Возможный дубликат:
Когда использовать встроенную функцию, а когда нет?

При каких условиях Можно (не должен) функция не быть встроенным (Только C ++)?

Два условия, которые я знать из являются:

1 Если функция имеет рекурсивный вызов

2 Если в функции есть статические переменные

0

Решение

inline является ключевым словом C ++, но встраивание — это общий процесс, выполняемый бэкендом компилятора, обычно после того, как последовательности команд уже сгенерированы.

Компилятор C также встроит функции, а компилятор C ++ встроит функции, которые не являются inline, Компилятор C ++ также может не встроить inline функционировать по любой произвольной причине. Ключевое слово фактически существует, чтобы указать, что функция может иметь несколько идентичных определений в разных единицах перевода (исходных файлах).

Статические переменные не имеют особого отношения к тому, может ли что-то быть встроено. Возможно, некоторым компиляторам сложно связать результирующую структуру ссылок на глобальные переменные, но это скорее ошибка, чем практическое правило.

Рекурсивные функции также могут быть встроенными. Рекурсивный вызов должен быть переведен в ветку. Затем ветвь может быть направлена ​​на развертывание цикла.

Функция, которая компилируется в более чем килобайт кода, обычно не будет встроенной. Но компилятор может обеспечить #pragma директивы или специфичные для платформы атрибуты для принудительного встраивания в таком случае.

Самый большой фактор, который мешает функции быть встроенной, — это если ее источник не доступен компилятору во время генерации кода. Оптимизация времени соединения открывает возможность встраивания функций, которые extern и не inline но функция, предоставляемая DLL-библиотекой, безусловно, запрещена. Но тогда вы все равно можете запустить его через механизм исполнения в стиле JIT, который может встроить (соединить) любые произвольные фрагменты, которые ему нравятся.

2

Другие решения

Единственная ситуация, в которой функция не могу быть встроенным, если в модуле компиляции нет определения функции. Даже это не помешает встраиванию времени компоновки оптимизатором времени компоновки.

Обратите внимание, что inline Ключевое слово на самом деле просто подсказка — компилятор может отказаться от встроенных функций с ним и выбрать встроенные функции без него.

1

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector