>[оверквотинг удален]
#include <stdio.h>
#include <stdlib.h>static inline int f1(int a) __attribute__((always_inline));
static inline int f2(int a) __attribute__((always_inline));
static inline int f1(int a)
{
return a + 1;
}
static inline int f2(int a)
{
int i;
for (i = 0; i < 10; ++i) {
if (a < 5)
a += 2;
else
a += 3;
}
printf("f2 done\n");
return a;
}
int main(void)
{
int x = 5;
x = f1(x);
x = f2(x);
printf("x = %d\n", x);
return EXIT_SUCCESS;
}
> Компилируем и смотрим какие функции заинлайнились, а какие нет:
>
> $ gcc -Wall -O2 main.c
> $ objdump -DCS a.out | less
>
> Видем следующую картину:
0000000000400546 <main>:
400546: 55 push %rbp
400547: 48 89 e5 mov %rsp,%rbp
40054a: 48 83 ec 10 sub $0x10,%rsp
40054e: c7 45 fc 05 00 00 00 movl $0x5,-0x4(%rbp)
400555: 8b 45 fc mov -0x4(%rbp),%eax
400558: 89 45 f8 mov %eax,-0x8(%rbp)
40055b: 8b 45 f8 mov -0x8(%rbp),%eax
40055e: 83 c0 01 add $0x1,%eax
400561: 89 45 fc mov %eax,-0x4(%rbp)
400564: 8b 45 fc mov -0x4(%rbp),%eax
400567: 89 45 f4 mov %eax,-0xc(%rbp)
40056a: c7 45 f0 00 00 00 00 movl $0x0,-0x10(%rbp)
400571: eb 14 jmp 400587 <main+0x41>
400573: 83 7d f4 04 cmpl $0x4,-0xc(%rbp)
400577: 7f 06 jg 40057f <main+0x39>
400579: 83 45 f4 02 addl $0x2,-0xc(%rbp)
40057d: eb 04 jmp 400583 <main+0x3d>
40057f: 83 45 f4 03 addl $0x3,-0xc(%rbp)
400583: 83 45 f0 01 addl $0x1,-0x10(%rbp)
400587: 83 7d f0 09 cmpl $0x9,-0x10(%rbp)
40058b: 7e e6 jle 400573 <main+0x2d>
40058d: bf 44 06 40 00 mov $0x400644,%edi
400592: e8 79 fe ff ff callq 400410 <puts@plt>
400597: 8b 45 f4 mov -0xc(%rbp),%eax
40059a: 89 45 fc mov %eax,-0x4(%rbp)
40059d: 8b 45 fc mov -0x4(%rbp),%eax
4005a0: 89 c6 mov %eax,%esi
4005a2: bf 4c 06 40 00 mov $0x40064c,%edi
4005a7: b8 00 00 00 00 mov $0x0,%eax
4005ac: e8 6f fe ff ff callq 400420 <printf@plt>
4005b1: b8 00 00 00 00 mov $0x0,%eax
4005b6: c9 leaveq
4005b7: c3 retq
4005b8: 0f 1f 84 00 00 00 00 nopl 0x0(%rax,%rax,1)
4005bf: 00