avatar10010 发表于 2014-10-30 18:55:25

inline机制的一点疑问

本帖最后由 风之残月 于 2014-11-9 22:37 编辑

inline int func(int a){ return ++a; }
#include <iostream>
int main()
{
      func(3);
}
对应汇编代码:
#include <iostream>
int main()
{
011C52F0push      ebp
011C52F1mov         ebp,esp
011C52F3sub         esp,0C0h
011C52F9push      ebx
011C52FApush      esi
011C52FBpush      edi
011C52FClea         edi,
011C5302mov         ecx,30h
011C5307mov         eax,0CCCCCCCCh
011C530Crep stos    dword ptr es:
      func(3);
011C530Epush      3
011C5310call      func (011C1299h)
011C5315add         esp,4
}
将func定义成inline后,为什么在调用func时还是将它按照一般函数调用格式进行调用?

仰望天上的光 发表于 2014-10-30 18:55:26

VC中inline必须在release模式下I才可能有效,debug下inline函数都作为普通函数

avatar10010 发表于 2014-10-30 19:49:16

仰望天上的光 发表于 2014-10-30 18:55
VC中inline必须在release模式下I才可能有效,debug下inline函数都作为普通函数

Thanks

avatar10010 发表于 2014-10-30 20:17:38

avatar10010 发表于 2014-10-30 19:49
Thanks

在release下无论我加不加inline效果都是一样,可否帮我写个栗子,我测试一下

流行语 发表于 2014-10-30 20:28:55

仰望天上的光 发表于 2014-10-30 18:55
VC中inline必须在release模式下I才可能有效,debug下inline函数都作为普通函数

我试了一下,在release版本下,有inline关键字跟没有这个关键字没有什么区别啊。

仰望天上的光 发表于 2014-10-30 20:43:16

流行语 发表于 2014-10-30 20:28
我试了一下,在release版本下,有inline关键字跟没有这个关键字没有什么区别啊。

你是怎么试的呢?

流行语 发表于 2014-10-30 20:52:08

这是截图

流行语 发表于 2014-10-30 20:53:02

release调试

avatar10010 发表于 2014-10-30 20:59:44

仰望天上的光 发表于 2014-10-30 20:43
你是怎么试的呢?

我将版本号选为release,然后按f10发现加不加inline,编译器都是将func函数体内部的代码直接嵌套在调用处而没有使用call这种方式调用func(我用的是vs2013)

avatar10010 发表于 2014-10-30 21:02:34

流行语 发表于 2014-10-30 20:53
release调试

我将版本号选为release,然后按f10发现加不加inline,编译器都是将func函数体内部的代码直接嵌套在调用处而没有使用call这种方式调用func(我用的是vs2013)

流行语 发表于 2014-10-30 21:08:28

我用的是vs2012,你没有设置其他的吗?可能IDE版本不同处理的也不同吧

仰望天上的光 发表于 2014-10-30 21:21:31

我用的是VS2010结果是这样的
--- f:\vc\my_vc\test_inline\test_inline\test.cpp -------------------------------
inline int func(int a){ return ++a; }
#include <iostream>
int main()
{
      int c = func(3);
                std::cout<<c;
00D21000mov         ecx,dword ptr
00D21006push      4
00D21008call      dword ptr
                return 0;
00D2100Exor         eax,eax
}
00D21010ret
--- f:\dd\vctools\crt_bld\self_x86\crt\src\intel\secchk.c ----------------------

仰望天上的光 发表于 2014-10-30 21:25:15

avatar10010 发表于 2014-10-30 20:59
我将版本号选为release,然后按f10发现加不加inline,编译器都是将func函数体内部的代码直接嵌套在调用处 ...

VS2013估计是代码优化做得比较好,直接判断出该函数可以inline 了

avatar10010 发表于 2014-10-30 22:28:15

仰望天上的光 发表于 2014-10-30 21:25
VS2013估计是代码优化做得比较好,直接判断出该函数可以inline 了

恩,应该是这样
页: [1]
查看完整版本: inline机制的一点疑问