inline 内联函数

906次阅读
一条评论

共计 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/

正文完
欢迎关注个人公众号
post-qrcode
 
HTML文本

本文链接:

a_yuan
版权声明:本站原创文章,由 a_yuan 2021-04-12发表,共计877字。
转载说明:除特殊说明外本站文章皆由CC-4.0协议发布,转载请注明出处。
评论(一条评论)
验证码
nebofeng 博主
2022-11-29 03:05:07 回复

测试

 Windows  Chrome  美国科进