【发布时间】: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