其他分享
首页 > 其他分享> > 为什么C内联函数有调用指令?

为什么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