Или я могу спросить, почему встроенное ключевое слово является просто подсказкой?
Потому что вы "могли бы" знать лучше, чем компилятор.
В большинстве случаев,для функций, не помеченных как встроенные (и правильно объявленные / определенные), компилятор, в зависимости от его конфигурации и реализации, сам оценит, может ли функция быть встроенной или нет.
Например, большинство компиляторов автоматически вставляют функции-члены, которые полностью определены в заголовке, если код не является длинным и / или слишком сложным.Это потому, что, поскольку функция доступна в заголовке, почему бы не вставить ее как можно больше?Однако этого не происходит, например, в режиме отладки для Visual Studio: в отладке отладочная информация по-прежнему должна отображать двоичный код функций, поэтому она избегает встраивания, но все же встроенные функции будут помечены как встроенные, поскольку пользователь требуетЭто.Это полезно, если вы хотите пометить функции, которые вам не нужны, чтобы иметь информацию о времени отладки (например, простые методы получения), в то же время получая более высокую производительность во время отладки.В режиме Release (по умолчанию) компилятор агрессивно вставляет все, что может, затрудняя отладку некоторой части кода, даже если вы активируете отладочную информацию.
Итак, общая идея заключается в том, что если вы кодируете вТаким образом, это помогает встроить компилятор, он встроит столько, сколько сможет.Если вы пишете свой код так, что его трудно или невозможно встроить, этого не произойдет.Если вы помечаете что-то встроенное, вы просто указываете компилятору, что если ему трудно, но не невозможно встроить, оно должно встроить его.
Поскольку встраивание зависит как от контекста вызывающего, так и вызываемого, нет«правило».Часто советуют просто игнорировать явную пометку функции как встроенную, но в двух случаях:
- , если вам нужно поместить определение функции в заголовок, он просто должен быть встроенным;часто это касается шаблонных (членских или нет) функций и других служебных функций, которые являются просто ярлыками;
- , если вы хотите, чтобы определенный компилятор вел себя определенным образом во время компиляции, например, пометив некоторые функции-члены как встроенныевстроенный даже в конфигурации отладки на компиляторах Visual Studio, например.
Всегда ли компилятор делает это лучше, чем программист?
Нет, поэтому иногдаможет помочь использование встроенного ключевого слова.Программист может иногда иметь лучшее общее представление о том, что необходимо, чем компилятор.Например, если программист хочет, чтобы его двоичный файл был наименьшим, в зависимости от кода, встраивание может быть вредным.В быстродействии требуется применение, агрессивное наложение может очень помочь.Как бы компилятор узнал, что требуется?Он должен быть настроен и иметь возможность точно знать, что на самом деле хочет быть встроенным.