требование, чтобы функция была встроенной в c ++ - PullRequest
4 голосов
/ 07 августа 2010

Каковы требования к функции, чтобы она могла быть выполнена в C ++?есть ли случай, когда функция не может быть встроенной?или любая функция может быть встроенной, и программист должен решить, как определить функцию на основе времени выполнения и времени компиляции?

Ответы [ 5 ]

5 голосов
/ 07 августа 2010

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

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

4 голосов
/ 07 августа 2010

Каковы требования к функции, чтобы ее можно было выполнить встроенным в c ++?

Ее необходимо определить в каждой точке, в которой она вызывается (обычно это делается путемэто в .h).

есть ли случай, когда функция не может быть встроенной?

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

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

Ключевое слово inline - это просто подсказка программисту компилятору, что программист действительно хотел бы, чтобы эта функция была встроенной (предположительно, программист обнаружил существенные накладные расходы на вызовы).с маленькой функцией, вызываемой в «горячих» циклах, как показано профилировщиком - или, функция настолько мала, что примерно такая же маленькая, как вызывающий code ;-) - или, встраивание функции позволяет "оптимизацию через границы функций", которую конкретный компилятор не может обнаружить или не может выполнить иначе - и т. д.).

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

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

«На всякий случай» ваш компилятор очень искренне воспринимает ваши inline подсказки, его часто стоит измерятьРазмер и скорость кольцевого кода с и без inline (если ваш компилятор не предлагает параметр / флаг для этой цели, просто #define inline определенно "отключит" эффект inline и тем самым разрешит такое измерение).Но если вы собираетесь развернуть свой код на нескольких компиляторах, особенно.для нескольких архитектур имейте в виду, что положительные эффекты на одной платформе могут оказаться контрпродуктивными на другой, учитывая разницу в стратегиях оптимизации компиляторов и в архитектурах ЦП.

4 голосов
/ 07 августа 2010

Каковы требования к функции, чтобы она могла быть выполнена inline в c ++?есть ли случай, когда функция не может быть встроенной?

Встроенная функция - это всего лишь функция, в которой вызов функции заменяется фактическим кодом.Если вы пойдете по этому определению, вы можете скопировать и вставить код вручную, и он будет «встроенным».Однако это не всегда может быть хорошей идеей: это вопрос скорости и размера программы.По мере того, как функции становятся больше, выгода от того, что они встроены, уменьшается.

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

Обычно, когда вы используете ключевое слово inline, это всего лишь запрос, и компилятор выбирает, действительно ли сделать вызов функции встроенным.Многие компиляторы также предоставляют способ заставить функцию быть встроенной (например, MSVC имеет ключевое слово __forceinline) - в этом случае компилятор не пытается быть умным, поэтому вы должны взвесить преимуществаделая функцию встроенной.

1 голос
/ 01 декабря 2013

встроенных функций зависит от длины кода и сложности кода ... :) Встроенная функция - это просто запрос к компилятору ...

1 голос
/ 07 августа 2010

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

Это компилятор, который на основе некоторых условий использует эту функцию как встроенную функцию.

...