C++ 内联函数

为学者日益,为道者日损,损之又损,以至于无为,无为而无不为。  -- 老子


c++从C中继承的一个重要特性是效率! 如果c++的效率显著地低于c的效率,那么,就会有很大一批程序员不去使用c++。

在c中提高效率的一个方式是使用宏(macro)。 使用宏 可以不需要普通的函数调用代价即可使之看起来像函数调用。宏的实现是用预处理器而不是编译器。预处理器直接使用宏代码代替宏调用,所以就没有了参数压栈、生成汇编语言CALL、执行汇编语言return的开销。所有的工作由预处理器来完成, 从而 不用花费额外时间就有了程序调用的便利和可读性。

但是在c++中使用预处理器宏存在两个问题。 第一个在c中也存在: 宏看起来像一个函数调用,但不总是如此,容易隐藏难以发现的错误。 第二个问题是c++特有的:预处理器不允许访问类的成员数据, 这意味着宏不能用作类的成员函数。

为了既保持预处理器宏的效率又增加安全性,而且还能像一般成员函数一样可以在类里访问自如,c++引入了内联函数(inline function)。

预处理器的缺陷

eg. #define F (x) (x+1)

现在假如有一个F的调用: F(1),    由于在定义时F与(x)之间存在空格, 预处理器展开后的样子是:

(x) (x+1)(1)

去掉F与(x)之间空格后,在调用时写成F (1),能被正确地展开称(1+1).

-----------------需要继续理解这个截图。  意思是在类的定义中使用#define没有意义吧。

常用的宏定义:


内联函数:

在C++中宏的概念是使用内联函数来实现的,而无论从哪一方面来说,内联函数都是真正的函数。唯一不同之处是内联函数在适当的地方像宏一样展开,所以不需要函数调用的开销。

任何在类中定义的(在花括号内)函数会自动地成为内联函数;

也可以在非类的函数前面加上inline关键字使之成为内联函数:必须使函数体和声明结合在一起,否则,编译器将它作为普通函数对待,例如,inline int plusOne(int x); 没有任何效果,有效的方式是:

inline int plusOne(int x) { return ++x; }

类内部的内联函数:

任何在类中定义的(在花括号内)函数会自动地成为内联函数;

在类中,访问函数(read, set)经常被设置为内联函数。

编译器决定是否执行内联:

使用inline函数常见问题:

案例:

在class A中,有一个内联函数void a(),如果我们在A.h中对其声明并定义,没有任何问题;如果在A.h中对其声明,然后在A.cpp中对其进行实现(inline void a(){...}),那么不能在其他的cpp中,例如B.cpp再使用该函数(#include A.h),否则会报link error,即找不到这个函数的实现。

推测原因:编译器编译B.cpp文件时,能够从A.h中得到该函数的签名,于是将其作为一个外部符号。链接时,从其他obj文件中寻找这个函数,但是A.cpp对应的obj文件并没有实现这个函数,即编译器并没有将a函数编进A的obj文件,所以link error。

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

First Snowflakes

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值