赞
踩
一、函数存在的意义
对于一些经常调用的运算,我们经常会将其定义成一个函数,并在使用时直接调用所需函数就好了。
1、在进行这些短小而又使用频繁的运算的时候,我们去理解一个这样的运算函数比理解等价的表达式方便得多,使用函数可以使整个代码显得简洁清晰;
2、进行多次相同的运算的时候,调用同一个函数更能保证执行的统一性;
3、一旦要进行修改这个运算,我们去一个个修改每个运算表达式远不如直接修改一个函数定义简单方便。
二、函数的缺点
调用函数时所花费的开销,将会拖慢程序执行的效率。对于那些函数体量大,使用频率较小的函数,这一点缺点在函数的便捷性面前显得微不足道,但是对于那些短小又使用频繁的函数,每一次为了调用这么函数拖慢程序并且还要经常调用,这就有些划不来了。
三、内联函数的意义
对于上面说到的函数的缺点,这时内联函数就给出了它的解决方式。
使用内联函数(inline),可以使其省去调用时的开销,每次使用时,它会在相应位置进行“展开”,然后发挥其作用。
怎么去理解呢,我们在定义函数的时候,函数体里面的内容就已经给这个函数赋予了相应的作用,在我们调用它之后,我们直接使用这个函数,这个函数就会发挥相应作用,我们并不需要知道发挥这个作用具体是怎么执行的,也就是函数体里面的那些东西我们并不关心,知道函数有什么用就好了;但是当我们定义了一个内联函数,其实更像给函数体里面的内容打了包,当我们去使用执行它的时候,相当于直接把这个包裹打开了去执行,但是我们在写代码的时候这一过程还是看不见的,只是电脑去执行的时候会给它进行“展开”,所以使用时可以使内联函数看起来跟函数一样具有便捷性。
如此一来内联函数便继承了函数的便捷性,并且避免了拖慢程序效率。
四、内联函数使用方式
定义内联函数时,我们只需要在定义的时候在前面加一个inline就好了。
例如下面代码:
- inline int min(int a, int b) {
- return a < b ? a : b;
- }
这里需要注意的是,一定要在定义的时候加这个inline,在声明的时候加是没有用的。
除此之外,因为内联函数的实质是“展开”,而不是调用,所以如果在源文件a.cpp里面定义了内联函数f(a),在另一个源文件b.cpp里是使用不了的,即使你在a.cpp里面定义之后还在头文件里进行了声明,然后在b.cpp调用了这个头文件,也是会报错的。
所以说,要是那些只在每一个源文件使用的内联函数,就在这个源文件里定义没问题,但是如果需要在很多个源文件都要使用,我们就必须直接在头文件里面定义这个内联函数并调用头文件。
示例代码:
头文件(yu.h):
- #pragma once
- int max(int a, int b);
-
- inline int min(int a, int b) {
- return a < b ? a : b;
- }
定义有函数的某个源文件(hanshu.cpp):
- int max(int a, int b) {
- return a > b ? a : b;
- }
源文件(Main.cpp):
- #include "yu.h"
- #include <iostream>
- using namespace std;
-
- int main() {
- int x = 1, y = 2;
- int n = max(x, y);
- int m = min(x, y);
- cout << n << " " << m << endl;
- }
输出:
2 1
这段代码应该很多好理解,其中max函数我们定义成了一个普通函数放在hanshu.cpp中并且在头文件yu.h中声明,min函数我们直接在头文件yu.h中定义,在Main.cpp中我们调用了这个头文件之后,我们就能正常使用max函数和min函数。
五、使用内联函数需要注意的几个地方
1、内联函数虽好,但不要过度使用,因为内联其实可能会造成一些比较麻烦bug,暂时我还没有深入研究过,只需记住,内联函数不能完全取代普通函数;
2、我们一般遇到那些简短而频繁使用的运算时才通常定义为内联函数,一般情况下是没必要的;
3、一定一定要注意inline关键字要和函数定义也就是函数体放在一起才能定义成功。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。