Они встроены даже без ключевого слова inline
.Ваш пример был слишком тривиальным, и ввод не был необходим, поскольку возвращаемое значение было известно во время компиляции.
https://godbolt.org/z/tNcSrf
volatile int x;
int foobar(int x)
{
return x * x;
}
int main()
{
printf("%d\n", foobar(x));
}
foobar:
mul r0, r0, r0
bx lr
main:
push {r3, lr}
ldr r3, .L5
ldr r0, .L5+4 //inlined here
ldr r1, [r3]
mul r1, r1, r1
bl printf
movs r0, #0
pop {r3, pc}
.L5:
.word x
.word .LC0
.LC0:
.ascii "%d\012\000"
оставляет копию функции, как ее можно вызватьиз другой единицы перевода.Если функция вызывается много раз в одном и том же модульном компиляторе, она может вообще не включать ее (в зависимости от параметров компиляции).
, чтобы убедиться, что функция всегда встроена, вам необходимо использовать атрибут
inline __attribute__((always_inline)) int foobar(int x);
или
static inline __attribute__((always_inline)) int foobar(int x);