Ключевое слово inline
всегда было простым предложением для компилятора.Это означает, что если компилятор так выберет, он может проигнорировать предложение.Кроме того, если компилятор может встроить функцию, он может встроить функцию, даже если вы этого не просили.
При этом компилятор должен встроить функцию, которую он должен знать.тело функции.Если функция определена в отдельном модуле компиляции, то компилятор, вероятно, не знает определения функции вне этого модуля компиляции.В этом случае компилятор может только встроить функцию в вызывающие объекты в модуле компиляции, который определяет функцию.Итак, суть в том, что если вы хотите разрешить компилятору встроить функцию, то вы должны определить функцию в определении класса или добавить ключевое слово inline
и определить его в заголовке.Встроенные функции не нарушают ODR .
Еще одно соображение, которое вам следует учесть, заключается в том, что поскольку встроенные функции должны находиться в заголовке, а заголовки обычно включаются в число блоков компиляции,встроенные функции увеличивают статическую связь.Это означает, что изменение определения встроенной функции приведет к каскаду при компиляции через все зависимые блоки компиляции.Это важно: определение функции не должно быть частью интерфейса, но встроенные функции форсируют эту связь.
Для этой последней точки, в конце, я бы сказал, никогда встроить функцию.То есть до тех пор, пока вы не будете достаточно раздражены производительностью вашего приложения или библиотеки во время выполнения, после чего вы должны запустить свой профилировщик, чтобы посмотреть, не повлияют ли какие-либо конкретные функции на увеличение встроенной производительности.Встроенные функции могут также уменьшить размер исполняемого файла, если их вставка приводит к меньшему объектному коду, чем коду, необходимому для генерации вызова функции, но это менее важный фактор принятия решения в большинстве, но в немногих (встроенных?) Контекстах.
Профилировщик может сказать вам, что определенная функция может повысить производительность, если она встроена, но не может сказать, может ли конкретная встроенная функция повысить производительность (размер, время выполнения, развитие, ...), если она не встроена.