5

我读到内联函数,无论何时进行函数调用,我们都将函数调用替换为函数定义的主体。

根据上面的解释,当inline是用户时不应该有任何函数调用。

如果是这样,为什么我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  

笔记

目标文件的完整转储在这里

4

1 回答 1

6
  • 你没有优化所以调用没有内联
  • 您生成了一个目标文件(不是 .exe),所以调用没有被解析。您看到的是一个虚拟调用,其地址将由链接器填充
  • 如果您编译完整的可执行文件,您将看到跳转的正确地址

见第 28 页: http ://www.cs.princeton.edu/courses/archive/spr04/cos217/lectures/Assembler.pdf

于 2014-06-11T18:57:27.437 回答