Подтвердить что ты не робот

Когда компиляторы встроены в код С++?

В С++ методы только вставляются, если они явно объявлены inline (или определены в заголовочном файле) или компиляторам разрешено встроить методы по своему усмотрению?

4b9b3361

Ответ 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 ускоряет выполнение программы, поскольку устранены накладные расходы оператора функции и возврата. Тем не менее, это заставляет программу занимать больше памяти, потому что операторы, определяющие встроенные функции, воспроизводятся в каждой точке, где вызывается функция. Таким образом, необходим компромисс.

(Как указано в одной из моих книг ООП)