【问题标题】:Why does C++ inline function has call instructions?为什么 C++ 内联函数有调用指令?
【发布时间】:2014-08-01 22:42:43
【问题描述】:

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

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

注意

目标文件的完整转储为here

【问题讨论】:

  • inline 只是一个建议。这不是一个要求。如果你想强制它内联,见:stackoverflow.com/questions/8381293/…
  • @Mysticial 但是,这并没有跳转到函数或任何有用的地方。它跳到下一行。
  • @JanDvorak 看起来 OP 没有开启优化。
  • @Mysticial 这可以解释那些无用的争论动作,但是添加到哪里去了?另外,GCC 是如何产生 this 的?
  • @JanDvorak 哈哈,死代码。我猜即使没有优化,GCC 仍然会做 一些 的事情。

标签: c++ assembly inlining inline-functions


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

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

【讨论】:

  • 目标文件中的哪个位置存储调用应该引导的位置?
  • @fjardon: 那么我该如何优化它并强制编译内联呢?
  • @vikkyhacks 将-O 标志设置为更高的值。检查编译器的手册。
  • 您忘记了最重要的一点,即编译器可以随意忽略任何和所有inline 提示。
  • 另见objdump -dr 显示重定位条目,gcc -S 生成 asm 列表而不是反汇编。
猜你喜欢
  • 2011-06-30
  • 2013-03-14
  • 1970-01-01
  • 2018-02-20
  • 2010-11-06
  • 1970-01-01
  • 2011-04-30
  • 1970-01-01
  • 2021-04-29
相关资源
最近更新 更多