Clang использует решение, основанное на стоимости, будет ли функция встроена или нет. На эту стоимость влияет многое. На него влияет static
.
К счастью, clang имеет вывод, где мы можем это наблюдать. Обратите внимание на этот Godbolt ссылка :
void call();
inline void a() {
call();
}
static inline void b() {
call();
}
void foo() {
a();
b();
}
В этом небольшом примере a()
и b()
совпадают, за исключением того, что b()
- это stati c .
Если вы наведете указатель мыши на вызовы a()
или b()
на Godbolt (в окне OptViewer
), вы можете прочитать:
a()
: cost = 0, порог = 487
b()
: стоимость = -15000, порог = 487
(clang встроит вызов, если стоимость меньше порога.)
clang дал b()
гораздо меньшую стоимость, потому что это stati c. Кажется, что clang только один раз даст снижение стоимости на -15000 для функции stati c. Если b()
вызывается несколько раз, стоимость всех b()
s будет равна нулю, кроме одного.
Вот числа для вашего случая, ссылка :
process_value():
стоимость = 400, порог = 325 -> он чуть выше порога, не будет встроен
process_valueS():
: стоимость = -14600, порог = 325 -> ОК для встроенного
Таким образом, очевидно, что static
может иметь большое влияние, если его вызвать только один раз. Это имеет смысл, потому что однократная встраивание функции stati c не увеличивает размер кода.
Совет: если вы хотите заставить clang встроить функцию, используйте для этого __attribute__((always_inline))
.