malloc.c 를 살펴보던 중, 도배되어 있는 __builtin_expect() 를 보았다.
gcc 에는 __builtin_expect() 라는 기능이 있다.
찾아보니까 branch prediction 에 대한 힌트를 주는 키워드였다.
vmware@ubuntu:~$ cat test.c
#include <stdio.h>
int main(int argc, char * argv[])
{
// if (__builtin_expect(argc == 2, 0))
if (argc == 2)
{
puts("argc = 2");
}
puts("oh");
return 0;
}
Reading symbols from /home/vmware/aa...(no debugging symbols found)...done.
(gdb) disassemble main
Dump of assembler code for function main:
0x080483d4 <+0>: push ebp
0x080483d5 <+1>: mov ebp,esp
0x080483d7 <+3>: and esp,0xfffffff0
0x080483da <+6>: sub esp,0x10
0x080483dd <+9>: cmp DWORD PTR [ebp+0x8],0x2
0x080483e1 <+13>: jne 0x80483ef <main+27>
0x080483e3 <+15>: mov DWORD PTR [esp],0x80484e0
0x080483ea <+22>: call 0x80482f0 <puts@plt>
0x080483ef <+27>: mov DWORD PTR [esp],0x80484e9
0x080483f6 <+34>: call 0x80482f0 <puts@plt>
0x080483fb <+39>: mov eax,0x0
0x08048400 <+44>: leave
0x08048401 <+45>: ret
End of assembler dump.
(gdb) q
vmware@ubuntu:~$ gdb ./a.out -q
Reading symbols from /home/vmware/a.out...(no debugging symbols found)...done.
(gdb) disassemble main
Dump of assembler code for function main:
0x080483d4 <+0>: push ebp
0x080483d5 <+1>: mov ebp,esp
0x080483d7 <+3>: and esp,0xfffffff0
0x080483da <+6>: sub esp,0x10
0x080483dd <+9>: cmp DWORD PTR [ebp+0x8],0x2
0x080483e1 <+13>: sete al
0x080483e4 <+16>: movzx eax,al
0x080483e7 <+19>: test eax,eax
0x080483e9 <+21>: je 0x80483f7 <main+35>
0x080483eb <+23>: mov DWORD PTR [esp],0x80484e0
0x080483f2 <+30>: call 0x80482f0 <puts@plt>
0x080483f7 <+35>: mov DWORD PTR [esp],0x80484e9
0x080483fe <+42>: call 0x80482f0 <puts@plt>
0x08048403 <+47>: mov eax,0x0
0x08048408 <+52>: leave
0x08048409 <+53>: ret
End of assembler dump.
