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时还是将它按照一般函数调用格式进行调用?
VC中inline必须在release模式下I才可能有效,debug下inline函数都作为普通函数 仰望天上的光 发表于 2014-10-30 18:55
VC中inline必须在release模式下I才可能有效,debug下inline函数都作为普通函数
Thanks avatar10010 发表于 2014-10-30 19:49
Thanks
在release下无论我加不加inline效果都是一样,可否帮我写个栗子,我测试一下 仰望天上的光 发表于 2014-10-30 18:55
VC中inline必须在release模式下I才可能有效,debug下inline函数都作为普通函数
我试了一下,在release版本下,有inline关键字跟没有这个关键字没有什么区别啊。 流行语 发表于 2014-10-30 20:28
我试了一下,在release版本下,有inline关键字跟没有这个关键字没有什么区别啊。
你是怎么试的呢? 这是截图 release调试 仰望天上的光 发表于 2014-10-30 20:43
你是怎么试的呢?
我将版本号选为release,然后按f10发现加不加inline,编译器都是将func函数体内部的代码直接嵌套在调用处而没有使用call这种方式调用func(我用的是vs2013) 流行语 发表于 2014-10-30 20:53
release调试
我将版本号选为release,然后按f10发现加不加inline,编译器都是将func函数体内部的代码直接嵌套在调用处而没有使用call这种方式调用func(我用的是vs2013) 我用的是vs2012,你没有设置其他的吗?可能IDE版本不同处理的也不同吧 我用的是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 ---------------------- avatar10010 发表于 2014-10-30 20:59
我将版本号选为release,然后按f10发现加不加inline,编译器都是将func函数体内部的代码直接嵌套在调用处 ...
VS2013估计是代码优化做得比较好,直接判断出该函数可以inline 了 仰望天上的光 发表于 2014-10-30 21:25
VS2013估计是代码优化做得比较好,直接判断出该函数可以inline 了
恩,应该是这样
页:
[1]