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