В С++ методы только вставляются, если они явно объявлены inline
(или определены в заголовочном файле) или компиляторам разрешено встроить методы по своему усмотрению?
Когда компиляторы встроены в код С++?
Ответ 1
Да, компилятор может встроить код, даже если он явно не объявлен как inline
.
В принципе, до тех пор, пока семантика не будет изменена, компилятор может практически сделать все, что захочет, сгенерированным кодом. Стандарт не заставляет ничего особенного в сгенерированном коде.
Ответ 2
Ключевое слово inline действительно просто сообщает компоновщику (или сообщает компилятору рассказать компоновщику), что несколько идентичных определений одной и той же функции не являются ошибкой. Это вам понадобится, если вы хотите определить функцию в заголовке, или вы получите ошибки "множественного определения" из компоновщика, если заголовок включен в несколько компиляций.
Обоснование выбора inline в качестве ключевого слова, по-видимому, состоит в том, что единственная причина, по которой нужно было бы определить функцию (не шаблон) в заголовке, заключается в том, что она может быть встроена в компилятор, Компилятор не может встроить вызов функции, если только он не имеет полного определения. Если функция не определена в заголовке, компилятор имеет только объявление и не может встроить функцию, даже если она захочет.
В настоящее время я слышал, что не только компилятор оптимизирует код, но и компоновщик может это сделать. Линкером может (если они этого не делают) уже встроенными функциональными вызовами, даже если функция не была определена в одном модуле компиляции.
И, вероятно, не рекомендуется определять функции, большие, чем, возможно, одну строку в заголовке, если вообще (плохо для времени компиляции, и если большая функция будет встроена, это может привести к раздуванию и ухудшению производительности).
Ответ 3
Компиляторы могут встраивать любую функцию или не включать ее. Им разрешено использовать декор inline
как подсказку для этого решения, но им также разрешено игнорировать его.
Также обратите внимание, что функции-члены класса имеют неявное украшение inline
, если они определены прямо в определении класса.
Ответ 4
Если я не ошибаюсь, когда оптимизация включена, компилятор выполнит любую подходящую процедуру или метод.
Ответ 5
Компиляторы могут игнорировать вашу встроенную декларацию. Он в основном используется компилятором в качестве подсказки, чтобы решить, делать это или нет. Компиляторы не обязаны вставлять что-то, что помечено как встроенное, или не включать то, что нет. В основном вы находитесь во власти вашего компилятора и выбранного вами уровня оптимизации.
Ответ 6
Текст из IBM информационный центр,
Использование встроенного спецификатора - это только предложение компилятору о том, что встроенное расширение может быть выполнено; компилятор может игнорировать предложение.
Язык C Любая функция, за исключением основной, может быть объявлена или определяемый как встроенный с встроенным спецификатор функции. Статические локальные переменным не разрешается определяемый внутри тела встроенного функция.
Функции С++, реализованные внутри объявления класса, автоматически определяется встроенным. регулярное Функции С++ и функции-члены объявлен вне класса декларации, за исключением main, могут быть объявлены или определены как встроенный с встроенной функцией спецификатор. Статические локали и строки литералы, определенные в теле встроенная функция обрабатывается как один и тот же объект через единицы перевода;
Ответ 7
В документации вашего компилятора вам должно быть указано, что это зависит от реализации. Например, GCC в соответствии с его руководством никогда не строит код, если не будет применена оптимизация.
Если компилятор не встраивает код, ключевое слово inline будет иметь тот же эффект, что и статический, и каждый блок компиляции, который вызывает код, будет иметь свою собственную копию. Интеллектуальный компоновщик может уменьшить их до одной копии.
Ответ 8
Компилятор оптимизируется по своему усмотрению, если вы не указали обратное.
Ответ 9
Ключевое слово inline - это просто запрос к компилятору. Компилятор оставляет за собой право сделать или не сделать функцию встроенной. Одним из основных факторов, который управляет решением компилятора, является простота кода (не много циклов).
Функции-члены объявляются встроенными по умолчанию. (Здесь также решает компилятор)
Это не жесткие и быстрые правила. Он зависит от реализации компилятора.
Если кто-то знает другие факторы, пожалуйста, напишите.
Ответ 10
Компилятор может встраивать все, что захочет, в случае, если вложение не нарушает семантику кода и может достигать кода функции. Он также может встраиваться выборочно - делать встроенным, когда он считает это хорошей идеей, а не встроенным, когда он не считает это хорошей идеей или когда он нарушает семантику кода.
Некоторые компиляторы могут делать inlining, даже если функция находится в другой единицы перевода, которая называется генерации кода link-time.
Типичные случаи, когда inlining нарушали семантику кода, являются виртуальными вызовами и передают адрес функции в другую функцию или сохраняют ее.
Ответ 11
В некоторых ситуациях, когда встроенное расширение НЕ работает, выполните следующие действия:
- Для возвращаемых значений функций, если существует цикл, коммутатор или goto
- Для функции, не возвращающей значения, если оператор возврата завершен;
- Если функции содержат статические переменные
- Если встроенные функции рекурсивные.
Расширение Inline ускоряет выполнение программы, поскольку устранены накладные расходы оператора функции и возврата. Тем не менее, это заставляет программу занимать больше памяти, потому что операторы, определяющие встроенные функции, воспроизводятся в каждой точке, где вызывается функция. Таким образом, необходим компромисс.
(Как указано в одной из моих книг ООП)