首页 新闻 会员 周边 捐助

C++内联函数的汇编码是否有call的问题

0
悬赏园豆:50 [已解决问题] 解决于 2012-10-10 12:50

网上说,调用内联函数时,生成的汇编码时将内联函数的汇编码嵌入进去的,不会调用call。于是我试了一下,看了汇编码,为什么还是能看到call的调用呢?

源码:

 1 #include <iostream>
 2 using namespace std;
 3 
 4 class InlineTest{
 5 public:
 6     inline void test(){ cout<<"inline"<<endl; }
 7     void func(){test();}
 8 };
 9 
10 int main(){
11 
12     InlineTest it;
13     it.func();
14 
15     return 0;
16 }

 

VS2010下,设置一个断点,按F5调试,再按ctrl+alt+d,调出来的汇编码片段如下:

 1 --- h:\c++学习\c++学习\inline\inline.cpp -------------------------------------------
 2     void func(){test();}
 3 00E61510  push        ebp  
 4 00E61511  mov         ebp,esp  
 5 00E61513  sub         esp,0CCh  
 6 00E61519  push        ebx  
 7 00E6151A  push        esi  
 8 00E6151B  push        edi  
 9 00E6151C  push        ecx  
10 00E6151D  lea         edi,[ebp-0CCh]  
11 00E61523  mov         ecx,33h  
12 00E61528  mov         eax,0CCCCCCCCh  
13 00E6152D  rep stos    dword ptr es:[edi]  
14 00E6152F  pop         ecx  
15 00E61530  mov         dword ptr [ebp-8],ecx  
16 00E61533  mov         ecx,dword ptr [this]  
17 00E61536  call        InlineTest::test (0E611E5h)  
18 00E6153B  pop         edi  
19 00E6153C  pop         esi  
20 00E6153D  pop         ebx  
21 00E6153E  add         esp,0CCh  
22 00E61544  cmp         ebp,esp  
23 00E61546  call        @ILT+395(__RTC_CheckEsp) (0E61190h)  
24 00E6154B  mov         esp,ebp  
25 00E6154D  pop         ebp  
26 00E6154E  ret  
27 --- 无源文件 -----------------------------------------------------------------------

可见,还是有下面这句话的,为什么呢?求教!

17 00E61536  call        InlineTest::test (0E611E5h)  

-以上-
邵贤军的主页 邵贤军 | 初学一级 | 园豆:19
提问于:2012-10-09 23:08
< >
分享
最佳答案
0

debug模式下是不优化的,因此这个内联仍是函数调用

内联是否嵌入和编译器有关的

收获园豆:50
2012 | 高人七级 |园豆:21645 | 2012-10-10 08:32

测试了一下,g++也是不嵌入内联函数的代码段的(不是Debug,是g++ -S)

这样的话,两大主流的编译器都不会讲它嵌入代码。

怀疑:

 1.  要使内联函数被嵌入,需要其他的前提条件吗?

邵贤军 | 园豆:19 (初学一级) | 2012-10-10 12:42

内联函数一个优化选择,在用g++编译时,如果加上-O选项,那么代码才会被优化编译,将内联函数的代码嵌入到实际调用的地方。(gcc -O -S  sourceFile)

谢谢啦,引导我到编译器上看!

邵贤军 | 园豆:19 (初学一级) | 2012-10-10 12:49
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册