C++杂记: 内联函数的使用,与宏定义、成员函数区别

一、内联函数的使用

大部分函数默认是外部链接,而inline函数默认为内部链接。也就是说inline函数只能在本文件中使用,对其他文件是不可见的。

一般我们使用某个类的时候,都是在文件中加上该类的头文件,以便我们可以使用该类的接口。但如果将inline函数放在.cpp文件中,那么其只对.cpp文件有效,这样我们就无法访问它了。所以外部文件要是用类的内联成员函数时,我们将其放在类的声明的头文件中,通过包含该头文件来使用它。

例如:

/*test.h*/  
class test  
{  
public:  
    test():x(10){}  
    inline void print(){ cout << x << endl; }   
private:  
    int x;  
};  
...
/*main.h*/  
int main()  
{  
    test T;  
    T.print();  
    system("pause");  
    return 0;  
}  
像这样内联函数 print定义在头文件中,如果main.h调用print是没有问题的,但如果像下面这样:
/*test.h*/  
class test  
{  
public:  
    test():x(10){}  
    inline void print();  
private:  
    int x;  
};  
/*test.cpp*/  
void test::print()  
{  
    cout << x << endl;  
}  

这时main中调用print会出现“

error LNK2019: 无法解析的外部符号 "public: void __thiscall test::print(void)" (?print@test@@QAEXXZ),该符号在函

数 _main 中被引用。”错误


二、内联函数与宏定义、成员函数区别

内联函数类似于C里边的宏,只是宏经常有一些不安全因素,比如 宏定义 add() 是 a+b,调用的时候宏定义直接展开,不做任何的判断,如果调用res = add()*c; 得到的代码就是res = a+b*c;不是想要的结果。 

   内联函数可以理解成一个安全的宏定义,他就是一个真正的函数,只是不用压栈出栈,速度快,而且比宏定义安全,所以利用 短且频率 比较高的函数可以写成内联函数inline。 
   内联函数在编译时,会将此内联函数代码直接编译到调用函数之处。减少了一次函数调用时的跳转、数据压栈等操作。所以相比调用行数,内联函数的执行效率要相对高点。不过也正因为如此,所以最终生成的程序文件要稍微大点。


三、注意

1.内联函数可减少cpu的系统开销,并且提高整体程序的速度,但当内联函数很大时,会有相反的作用,因此一般比较小的函数才使用内联函数。
2.内联是一种对编译器的请求,像register说明符一样。下面这些情况会阻止编译器服从这项请求.如果函数中包含有循环,switch或goto语句,递归函数,含有static的函数.
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值