网上说,调用内联函数时,生成的汇编码时将内联函数的汇编码嵌入进去的,不会调用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)
-以上-
debug模式下是不优化的,因此这个内联仍是函数调用
内联是否嵌入和编译器有关的
测试了一下,g++也是不嵌入内联函数的代码段的(不是Debug,是g++ -S)
这样的话,两大主流的编译器都不会讲它嵌入代码。
怀疑:
1. 要使内联函数被嵌入,需要其他的前提条件吗?
内联函数一个优化选择,在用g++编译时,如果加上-O选项,那么代码才会被优化编译,将内联函数的代码嵌入到实际调用的地方。(gcc -O -S sourceFile)
谢谢啦,引导我到编译器上看!