inline 函数到底有没有用?

Meuck 2003-08-22 10:11:49
先看下面代码:
#include<stdio.h>
#include<windows.h>
#include<mmsystem.h>
#pragma comment(lib,"winmm.lib")

inline int GetValue(int a,int b)
{
return a+b;
}
void main()
{
long t,i;

int a=10,b=20,c;
for(i=0;i<1000000;i++);

t = timeGetTime();
for(i=0;i<1000000;i++)
{
c=GetValue(a,b);
}
t = timeGetTime()-t;
printf("%ld\n",t);
}

这其中inline 加不加都没有太大影响。
那么inline 到底有没有用?
...全文
211 66 打赏 收藏 转发到动态 举报
写回复
用AI写文章
66 条回复
切换为时间正序
请发表友善的回复…
发表回复
ejiue 2003-08-30
  • 打赏
  • 举报
回复
inline的引入大部分是为了参数类型安全检查和防止边界效应。
如果是宏函数,可能有边界效应。

如果说效率,对于很短的一段函数,效率能有很大的提高。
象楼主的这个例子,inline绝对能提高很大的效率。
因为栈的操作看来都是不必要的。而且占了不小的比重。

好象有强制inline的说法,一下子记不得了。
如果编译器真的inline了,估计和宏差不多。
sxxny 2003-08-29
  • 打赏
  • 举报
回复
其实inline函数对编译器的实现来说其实是一件比较困难的事情,,主要在参数的传递上面。。有时候直接展开是不行的。
所以才导致各个编译器会有很大的差异。
Meuck 2003-08-29
  • 打赏
  • 举报
回复
to SnHnBn(大可达) :
呀,原来是这回事啊?
我不知道啊,我是初学的。
blue风儿 2003-08-29
  • 打赏
  • 举报
回复
VC 6.0
Inline 20
Not Inline 23
直接用c=a+b;代替c=GetValue(a,b);只需10
blue风儿 2003-08-29
  • 打赏
  • 举报
回复
VC 6.0
Inline 20
Not Inline 23
SnHnBn 2003-08-29
  • 打赏
  • 举报
回复
楼主啊,你用Debug方式编译不是在玩大家吗?
Debug方式的默认设置inline不会被内联编译,就跟普通函数一样,宏是源代码级的,当然没这个问题。
若是用Release方式编译,你的程序也不用那来对比了,就跟loveghb(温柔的毒药)说的一样,被提到循环外了。并且循环也被优化掉了,根本不用做循环。因为循环中什么事情都没干。
所以运行起来几乎不花什么时间。
你若是想测试inline和宏的区别,在Debug模式下,把inline编译器参数打开。
SnHnBn 2003-08-29
  • 打赏
  • 举报
回复
楼主啊,听我说句话,我比较赞同loveghb(温柔的毒药)的观点。
至于你说的情况,我觉得是不是你没有用Release方式编译。
我建议你打开反汇编看一下编译后的代码,如果允许inline的话,优化过的代码应该和宏差不多的。
Mephisto_76 2003-08-29
  • 打赏
  • 举报
回复
函数中的语句大于8句以上的话,一般编译器就自动将你的inline 函数转化为uninline 函数。
super77 2003-08-29
  • 打赏
  • 举报
回复
to :Jinhao(辣子鸡丁)

如果是宏:
宏是把那个代码在当前位置展开,即变成了c=a+b,这样就没有任何函数调用了。所以对于你地程序而言根本不用测试肯定是最快的。

如果是内联函数:
编译之后应该是把代码直接插到调用位置(之所以说应该是指编译器不优化)所以之行地时候不会去压栈,调用函数代码,退栈,所以如果执行的次数多,就会比较快。

在执行到非内联函数
函数不在当前位置,是个指针,然后经历压栈,调用函数代码,退栈三个过程。会比较慢。
Jinhao 2003-08-28
  • 打赏
  • 举报
回复
上面更正
再说宏也是C++比(不)太推荐的方法。
Jinhao 2003-08-28
  • 打赏
  • 举报
回复
把楼主的代码稍稍改了一下
#include<windows.h>
#include <stdio.h>
#define GetValueMacro(a,b) a+b

inline int GetValue(int a,int b)
{
return a+b;
}

int GetValueNoinline(int a,int b)
{
return a+b;
}

int main()
{
long t,i;

int a=10,b=20,c;
for(i=0;i<1000000;i++);

t = GetTickCount();
for(i=0;i<1000000;i++)
{
// c=GetValueMacro(a,b);
// c=GetValueNoinline(a,b);
c=GetValue(a,b);
}
t = GetTickCount()-t;
printf("%ld\n",t);
}

最后得出的结果是:
宏 GetValueMacro:3~4毫秒
inline GetValue:7~8毫秒
function GetValueNoinline:7~9毫秒

得出的结果是宏明显快很多,inline比non-inline的差别不大。
inline相对C++来说毕竟是有效率优势的,再说宏也是C++比太推荐的方法。
bluedodo 2003-08-28
  • 打赏
  • 举报
回复
编译器会智能地选择一些非inlineE函数变成内联函数,这些问题还是不要考虑了吧~~
nirvana_li 2003-08-28
  • 打赏
  • 举报
回复
楼主不要急~~~大家都在帮你看这个问题。
nirvana_li 2003-08-28
  • 打赏
  • 举报
回复
to :回复人: sxxny(柳水)
你说的:
“inline在程序运行时候会驻留内存,提高该函数的访问速度。?????????????
是真的吗????,,inline函数在编译的时候就被替换了,,严格的说它根本不是函数,只是一个宏,怎么会有驻留内存之说啊??”

这句话有问题~~~有大问题,inline函数在编译时不一定就要“展开”的,编译器会测试条件。编译器对此怎么样测试,是根据具体的编译器具体实现。在《深入C++对象模型》中有讲到Cfront就是计算内部一些操作的权值。还有要严格的说的话,inline就是函数,不是什么其他的,它就是函数,只是函数~~。

请大家赐教~~~
Meuck 2003-08-28
  • 打赏
  • 举报
回复
我要晕倒了!大家讨论了半天都没个结果!
to loveghb(温柔的毒药):
我也有同感。

不知是不是大家先入为主的关系。都觉得这个太简单了。
拜托。我再强调一次。

宏。值大概是 40~70
用inline function 则是600~800

如果是我的代码写得不符合要求,说出来为什么。
否则,说说结果为什么是这样。

不要再说inline 的定义!!!!!
cccbuiler 2003-08-28
  • 打赏
  • 举报
回复
inline适用于内联的,是个概念大家都明白
但是,内联的用途好要大家来讨论吗?
他与宏的区别这也是显而易见的

inline和宏一样都可以节省内存,提高编译和程序的执行效率
但是,inline所定义的是函数,宏定义的是一串字符
从安全的来讲,inline比宏更安全了,这是下显而易见的
例如:在inline中不会象宏那样有那么多的多义性
robbie24 2003-08-28
  • 打赏
  • 举报
回复
inline是的选择权在编译器手里.就算有些地方你写的很清楚,它也不会给你转.
inline的好处当然有,否则CPP委员会不会放它进去的.
楼上都说的很清楚了,我只想告诉你一点。
如果你用过C的话,你很清楚宏在某些地方的使用是比函数有效率的。
但是,宏又很不安全。
所以,想使用拥有安全类型检测的宏,而又无须消耗调用函数的开销吗?
那么请在适当的位置对适当的函数使用inline修饰符.
loveghb 2003-08-28
  • 打赏
  • 举报
回复
to Meuck(暗流,如果你相信什么,你就应当有所了解) :
把汇编代码拉出来瞧瞧吧!看了它就什么都知道了。

Meuck 2003-08-28
  • 打赏
  • 举报
回复
大家听清楚了,我的测试结果表明.
宏同inline函数,效率上根本不是一个级别的.

宏。值大概是 40~70
用inline function 则是600~800

速度是十几倍的差距!!!.
就同普通的函数没两样!!!.
sxxny 2003-08-28
  • 打赏
  • 举报
回复
inline在程序运行时候会驻留内存,提高该函数的访问速度。?????????????
是真的吗????,,inline函数在编译的时候就被替换了,,严格的说它根本不是函数,只是一个宏,怎么会有驻留内存之说啊??
加载更多回复(46)

69,371

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧