我读到对于内联函数,无论在哪里进行函数调用,我们都将函数调用替换为函数定义的主体。
根据上面的解释,当inline
为user时,不应该有任何函数调用。
如果是这种情况为什么我在汇编代码中看到三个call
指令?
#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
注意
对象文件的完整转储在这里
- 你没有优化所以调用没有内联
- 您生成了一个对象文件(不是.exe),因此无法解析调用。您看到的是一个虚拟调用,其地址将由链接器 填充。
- 如果你编译一个完整的可执行文件,你会看到跳转的正确地址
见第28页:http://www.cs.princeton.edu/courses/archive/spr04/cos217/lectures/Assembler.pdf