为什么C内联函数有调用指令?
作者:互联网
我读到内联函数,在进行函数调用时,我们用函数定义的主体替换函数调用.
根据以上说明,当内联是用户时,不应该有任何函数调用.
如果是这种情况为什么我在汇编代码中看到三个调用指令?
#include <iostream>
inline int add(int x, int y)
{
return x+ y;
}
int main()
{
add(8,9);
add(20,10);
add(100,233);
}
meow@vikkyhacks ~/Arena/c/temp $g++ -c a.cpp
meow@vikkyhacks ~/Arena/c/temp $objdump -M intel -d a.o
0000000000000000 <main>:
0: 55 push rbp
1: 48 89 e5 mov rbp,rsp
4: be 09 00 00 00 mov esi,0x9
9: bf 08 00 00 00 mov edi,0x8
e: e8 00 00 00 00 call 13 <main+0x13>
13: be 0a 00 00 00 mov esi,0xa
18: bf 14 00 00 00 mov edi,0x14
1d: e8 00 00 00 00 call 22 <main+0x22>
22: be e9 00 00 00 mov esi,0xe9
27: bf 64 00 00 00 mov edi,0x64
2c: e8 00 00 00 00 call 31 <main+0x31>
31: b8 00 00 00 00 mov eax,0x0
36: 5d pop rbp
37: c3 ret
注意
目标文件的完整转储是here
解决方法:
>您没有进行优化,因此不会内联调用
>您生成了一个目标文件(不是.exe),因此无法解析调用.你看到的是一个虚拟调用,其地址将由链接器填充
>如果编译完整的可执行文件,您将看到跳转的正确地址
见第28页:
http://www.cs.princeton.edu/courses/archive/spr04/cos217/lectures/Assembler.pdf
标签:inline-functions,c,assembly,inlining 来源: https://codeday.me/bug/20190825/1715042.html