Каковы требования к функции, чтобы ее можно было выполнить встроенным в c ++?
Ее необходимо определить в каждой точке, в которой она вызывается (обычно это делается путемэто в .h
).
есть ли случай, когда функция не может быть встроенной?
Не в смысле языкового стандарта, я полагаю,хотя, конечно, каждый компилятор может и будет реализовывать некоторые собственные ограничения.
или любая функция может быть встроенной, и программист должен решить, как определить функцию, основываясь на времени выполнения.и соображения времени компиляции?
Ключевое слово inline
- это просто подсказка программисту компилятору, что программист действительно хотел бы, чтобы эта функция была встроенной (предположительно, программист обнаружил существенные накладные расходы на вызовы).с маленькой функцией, вызываемой в «горячих» циклах, как показано профилировщиком - или, функция настолько мала, что примерно такая же маленькая, как вызывающий code ;-) - или, встраивание функции позволяет "оптимизацию через границы функций", которую конкретный компилятор не может обнаружить или не может выполнить иначе - и т. д.).
Компилятор свободен вигнорировать подсказку так же, как можно игнорировать более старую register
подсказку для класса хранения переменной (я полагаю, что в настоящее время большинство оптимизирующих компиляторов C ++ игнорируют register
, но меньшее количество игнорирует inline
) - IOW, компилятор может свободно встроитьвсе или некоторые вызовы функции независимо от того, объявлена ли эта функция inline
или нет.
(Конечно, она не будет "встроенными вызовами", когда они выполняются через явный указатель на функцию, котораяспрятан в некоторых точках и используется в других, или когда адрес функции передается в качестве параметра какой-либо другой функции - но это может повлиять на встраивание определенных вызовов, а не обязательно других вызовов той же функции, которые выполняются по-разному).
«На всякий случай» ваш компилятор очень искренне воспринимает ваши inline
подсказки, его часто стоит измерятьРазмер и скорость кольцевого кода с и без inline
(если ваш компилятор не предлагает параметр / флаг для этой цели, просто #define inline
определенно "отключит" эффект inline
и тем самым разрешит такое измерение).Но если вы собираетесь развернуть свой код на нескольких компиляторах, особенно.для нескольких архитектур имейте в виду, что положительные эффекты на одной платформе могут оказаться контрпродуктивными на другой, учитывая разницу в стратегиях оптимизации компиляторов и в архитектурах ЦП.