C++的inline函数

一、定义

inline是C++关键字,在函数声明或定义中,函数返回类型前加上关键字inline,即可以把函数指定为内联函数。这样可以解决一些频繁调用的函数大量消耗栈空间(栈内存)的问题。关键字inline在函数声明和定义的时候都要加上,不写系统还是会当成常规函数。


二、原理

普通函数的调用要经过“保存现场、转到被调函数执行、执行完毕返回调用处、恢复现场”这一系列过程,产生时空开销。而内联函数则是将函数的代码直接放在了函数的位置上,所以没有指令跳转,指令按顺序执行。但是,inline只适合简单的函数使用,不能包含复杂的结构控制语句例如switch,while,并且不能是直接递归函数(自己调用自己)。

注意:inline只是对编译器的一个建议

我们声明定义了内联函数,最终都要看编译器怎么决定,它觉得函数不复杂,可以在调用的地方展开,就会执行内联程序,但是如果编译器认为函数复杂,展开的开销比调用造成的栈空间消耗还大,就不会内联。更进一步,一个好的编译器能自动决定函数是否应该被当做内联函数使用,不管是否添加inline关键字。

三、什么时候使用内联函数

1)函数本身内容比较少,代码比较短,函数功能相对简单

2)函数被调用得频繁,不如循环中的函数

错误全局函数例子:function_inline

inline void function_inline();
void function_inline()
{
    std::cout << __FILE__ << ":" << __LINE__ << "/" << __FUNCTION__ << std::endl;
}

正确全局函数例子:function_inline

inline void function_inline()
{
    std::cout << __FILE__ << ":" << __LINE__ << "/" << __FUNCTION__ << std::endl;
}

 运行结果

错误成员函数例子:class_inline::function_inline

//class_inline.h
class class_inline 
{
    public: 
    inline void function_inline();
};
 
//class_inline.cpp
void class_inline::function_inline()
{
    std::cout << __FILE__ << ":" << __LINE__ << "/" << __FUNCTION__ << std::endl;
}

正确成员函数例子:class_inline::function_inline

//class_inline.h
class class_inline 
{
public: 
    inline void function_inline() 
    {
        std::cout << __FILE__ << ":" << __LINE__ << "/" << __FUNCTION__ << std::endl;
    }
};

不推荐

class class_inline 
{
public: 
    inline void function_inline();
};
 
//class_inline.cpp
inline void class_inline::function_inline()
{
    std::cout << __FILE__ << ":" << __LINE__ << "/" << __FUNCTION__ << std::endl;
}

不推荐

//class_inline.h
class class_inline {
public: 
    void function_inline();
};
 
//class_inline.cpp
inline void class_inline::function_inline()
{
    std::cout << __FILE__ << ":" << __LINE__ << "/" << __FUNCTION__ << std::endl;
}

四、总结

优点:避免了指令的来回跳转,加快程序执行速度

缺点:代码被多次复制,增加了代码量,占用更多的内存空间

参考:

#C++基础# inline __forceinline __attribute__((always_inline)内联函数_潇汀-CSDN博客

内联函数_renwu-CSDN博客_内联函数

inline函数(内联函数) - KLSeis - 博客园

  • 2
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值