inline函数

来源:互联网 发布:修改路由器lan口mac 编辑:程序博客网 时间:2024/06/09 08:00

      先给出一到判断题:inline函数表示编译器一定会将函数体直接插入到调用此函数的地方,这样可以加快程序的运行速度,上面说法是否正确.答案是false。为什么呢?下面给出解释:

首先我们要明白内联函数提出的原因及意义。下面使用c++primer中文版第四版(P221)中的例子详细解释一下。
//定义了查找更短字符串的函数
1
2
3
4
conststring &shortString(conststring &s1,conststring &s2)
{
returns1.size<s2.size()?s1:s2;
}
我们可以看到我们将查找更短字符串的操作定义了一个函数,这样做有很多的好处:
①更易于单身狗程序猿的理解;
②如果要修改,直接修改函数,不用修改所有的等价表达式,真是一本万利啊!
③使用函数确保每个调用实例能够统一;
④可以重复调用,代码重用,貌似和2一样啊;
你看,写成函数有这么多的好处,多好啊!但是,还是有缺点的:调用函数比直接用等价表达式要慢很多。调用等价表达式,直接编译代码一些列工作就行了。但是改成函数就不一样了,包括:调用前要先保存寄存器,并在返回时恢复;复制实参;程序还必须mov转到一个新的位置执行。你看,改成函数你好理解了,但是机器累到了。因此,就提出了内联函数,这样做就有好处:内联函数避免了函数调用的开销。将函数设置成内联函数就是将它在程序中的每个调用点上“内联”的展开。
cout<<shortString(s1,s2)<<endl;
那么编译是直接展开为:
cout<<( s1.size<s2.size()?s1:s2 )<<endl;
看起来不错,但是吧,编译器也很有脾气,内联函数对于编译器来说只是一个建议,编译器可以选择忽略,还是调用函数。你说它是不是很贱,不听老人言,非要吃力不讨好。貌似答案中提到,内联函数太长就忽略了。还有一点,内联函数需要在头文件中定义,这个跟一般的函数定义不同。


0 0
原创粉丝点击