共计 877 个字符,预计需要花费 3 分钟才能阅读完成。
inline 内联函数
如下函数
const string &shorterString(const string &s1, const string &s2)
{return s1.size() < s2.size() ? s1 : s2;}
在大多数机器上,调用函数要做很多工作:
- 调用前要先保存寄存器,并在返回时回复;
- 复制实参;
- 程序还必须转向一个新位置执行。
通过内联函数避免函数调用的开销: 将函数指定为内联函数,(通常)就是将他在程序中的每个调用点上“内联地”展开。假设我们将 shorterString
定义为内联函数,则调用:
inline const string &shortSring(const srting &s1, const srting &s2)
{return s1.size() < s2.size() ? s1 : s2;}
cout << shorterString(s1, s2) << endl;
在编译时将展开为:
cout << (s1.size() < s2.size() ? s1 : s2) << endl;
注意事项:
- 内联说明 对于编译器来说只是一个建议,编译器可以选择忽略这个建议;
- 内联函数应该在头文件中定义,这一点不同于其他函数;
- 在头文件中加入或修改内联函数时,使用了该头文件的所有源文件都必须重新编译。
- inline 成员函数的定义必须在调用该函数的每个源文件中时可见的。不在类定义体内的 inline 成员函数,其定义通常应放在有类定义的同一头文件中。
- 函数模板可以与非函数模板一样的方式声明为 inline, 说明符放在模板形参表之后,返回类型之前,不能放在关键字 template 之前, eg:
//ok:
template <typename T> inline T min(const T&, const T&);
//error:
inline template<typename T> T min(const T&, const T&);
使用原则:
- 一般来说内联机制适用于优化小的,只有几行的而且经常被调用的函数;
- 大多数的编译器都不支持递归函数的内联;
- 过长的函数不太可能在调用点被内联展开;
- 在类中定义的函数默认为 inline;
参考:C++ Primer(第 5 版)
IT 内容具有时效性,未避免更新后未同步,请点击查看最新内容:inline 内联函数
文章首发于:http://nebofeng.com/2021/04/12/inline-%e5%86%85%e8%81%94%e5%87%bd%e6%95%b0/
文章首发于:http://nebofeng.com/2021/04/12/inline-%e5%86%85%e8%81%94%e5%87%bd%e6%95%b0/
正文完
欢迎关注个人公众号, 内含各种工具及大厂内推码合集