前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >什么时候该用 inline 修饰函数

什么时候该用 inline 修饰函数

作者头像
ClearSeve
发布2022-02-10 19:04:48
9590
发布2022-02-10 19:04:48
举报
文章被收录于专栏:ClearSeve

问题

什么时候该用 inline 函数?具体有以下几个问题,

  1. 什么时候不应该用 inline 函数?
  2. 怎么让编译器不去 inline 函数?
  3. 如果一个 inline 函数被多个线程调用,会有性能上的影响么?

回答

先介绍下何谓 inline 函数,即内联函数。

inline 和宏定义 #define 的作用基本类似,都是替换或者展开。在程序编译阶段,如果遇到内联函数,则将内联函数的实现在当前位置展开。内联的目的是为了减少函数的调用开销,从而提高运行效率,但会增加代码体量。也就是说,对内联函数进行任何修改,都需要重新编译调用该函数的所有文件代码,因为编译器需要重新更换一次这个内联函数,否则将会继续使用旧的函数。

注意: 内联只是一种建议,并不要求编译器必须执行。如果内联函数本身开销较大(比如含有 for、switch、递归等),编译器可能拒绝内联展开。再者,现代编译器在函数内联的决策处理会比人类手写来的更准确。

我个人只在类似以下这种情况显示 inline:

代码语言:javascript
复制
class Example
{
public:
    inline std::string getName() { return m_name; }
    inline void setName(const std::string& name) { m_name = name; }
private:
    std::string m_name;
};

接着再回答你上述的提问,

  1. 什么时候该用 inline 函数? 如果这个函数的定义也放在头文件,那么你应该用 inline 修饰它。
  2. 什么时候不应该用 inline 函数? 函数执行时间可能较长,比如含有 for、switch、递归等。
  3. 怎么让编译器不去 inline 函数? 在 GCC 编译器下,可以使用 __attribute__(( noinline )) 修饰;而在 Visual Studio 下,则是 __declspec(noinline)
  4. 如果一个 inline 被多个线程调用,会有性能上的影响么? 完全不会!
本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2022年1月24日,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 问题
  • 回答
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档