Встраивание - это больше, чем просто копирование кода вставки в отличие от предварительной обработки макроса.
Когда компилятор сталкивается с какой-либо директивой inlining, он оценивает, что возвращает или делает встроенная функция.
Вы можете использовать такие сайты, как godbolt.org , чтобы увидеть, какая сборка генерируется для кода C. Например, следующие функции оценивают один и тот же код сборки:
#include <stdio.h>
inline void test1(int number){
printf("%d", number);
return;
}
inline int test2(){
return 1+1;
}
void doSomething() {
test1(test2());
}
void doSomethingElse() {
printf("%d", 2);
}
и сборка:
.LC0:
.string "%d"
_Z11doSomethingv:
sub rsp, 8
mov esi, 2
mov edi, OFFSET FLAT:.LC0
mov eax, 0
call printf
add rsp, 8
ret
_Z15doSomethingElsev:
sub rsp, 8
mov esi, 2
mov edi, OFFSET FLAT:.LC0
mov eax, 0
call printf
add rsp, 8
ret
Вы можете увидеть этот пример на https://godbolt.org/z/rBULdo
Следует также отметить, что встраивание - это оптимизация компилятора. Различные флаги компиляции могут привести к различным результатам от встраивания.
Это также зависит от того, сколько информации доступно во время компиляции в зависимости от времени выполнения. Если компилятор знает больше информации во время компиляции, он может оптимизировать лучше, чем если бы все было известно только во время выполнения.
См. ссылку для поведения GCC при обнаружении атрибута inline