注册 登录
编程论坛 C++教室

VC6.0对内联函数的支持情况如何?

jiaju111 发布于 2007-05-22 22:48, 1921 次点击
VC6.0对内联函数的支持情况如何?
为什么我写了个执行5000000次的程序
使用内联和不使用内联(把inline去掉)时间效率一样
程序如下:
#include<iostream>
#include<string>
using namespace std;
inline const string shorter(const string s1,const string s2)
{
return s1.size()<s2.size()?s1:s2;
}
void main()
{
string str1("china"),str2("english");
long i=5000000;
while(--i)
{
shorter(str1,str2);
}
}
大家帮我解释一下,谢谢
12 回复
#2
kisscjy2007-05-22 23:12
你的内联函数有循环while 存在,

这时编译器会拒绝对这条函数实现内联~~

而是转为普通的函数调用~~
#3
aipb20072007-05-22 23:31
楼主这样的测试,有说服力吗?表示怀疑!

楼上的说法倒是第一次听说。

估计跟编译器行为有关吧!
关注。
#4
kisscjy2007-05-23 00:15
呵呵,上网查的~~~~

(仅仅是听说而已,不知道对不对)

听说inline的实现权在编译器,并不由程序员全权决定,

该关键字只代表程序员的建议,对编译器没有强制约力。
#5
jiaju1112007-05-23 11:02
以下是引用kisscjy在2007-5-22 23:12:34的发言:
你的内联函数有循环while 存在,

这时编译器会拒绝对这条函数实现内联~~

而是转为普通的函数调用~~

那指的是内联函数本身包含循环或递归的时候大部分编译器都不支持

我的循环是在外面,应该不影响吧?

那3楼的说说应该怎么测试啊?

#6
leilinghua2007-05-23 12:27
inline指示对编译器来说只是一个建议,编译器可以选择忽略该建议,一般内联机制用来优化小的经常被调用的函数,很显然你的while循环没有以内联的形式表用函数了
#7
yuyunliuhen2007-05-23 13:29

了解内联作用就行了,内联的初衷是代替宏,我们几乎不使用宏,只使用内联函数。在类里面定义的函数将自动成为内联函数,也可以加上inline 关键字,通常函数体和声明结合在一起,否则内联将会失效,编译器将它作为普通函数对待。如
inline int pulsone(int x){return x++;}
一般把内联定义在头文件中,当编译器看到定义时,它把函数名和函数体放在符号表里。当使用函数时,编译器检查以确保调用的是正确的且返回值正确使用,然后函数替换函数体,消除了开销,但代价是占用更多内存,
我觉得LZ 的代码并不能证明什么.时间效率方面,LZ可有用专门的测试工具测试过,以我们的感觉是感觉不出来的,毕竟效率方面是需要很精确的。(个人看法而已)
关于内联和编译器,楼主可看看下面的,在哪些情况下内联会失效。。。。

只有本站会员才能查看附件,请 登录



#8
aipb20072007-05-23 13:31
yuyunliuhen


怎么我发不起新贴啊?
#9
yuyunliuhen2007-05-23 13:34
只有本站会员才能查看附件,请 登录



---Thinking in C++, 2nd edition, Volume 1 Revision_resouce---


#10
yuyunliuhen2007-05-23 13:37
和偶上次情况一样吧,上次是回复都不行,你把杀毒软件暂时关闭了,或者把缓存清理一下试试。。。
#11
aipb20072007-05-23 13:37
OK!!!
#12
jiaju1112007-05-23 14:48

谢谢大家的回复

但是为什么加上引用的话,效率将明显提高

用内联却这么不明显

#13
yuyunliuhen2007-05-24 17:23
这个得看内联适合在什么情况下使用。
如果是单行或很少的代码,他可以减少开销,提高效率,如果对于比较复杂的代码,还是用非内联比较合适
1