为什么c++内联函数有调用指令



我读到对于内联函数,无论在哪里进行函数调用,我们都将函数调用替换为函数定义的主体。

根据上面的解释,当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

相关内容

  • 没有找到相关文章

最新更新