C++学习序列笔记之内联函数
2011-08-09 19:00
429 查看
什么是内联函数?内联函数有什么好处?内联函数与C中的宏定义有什么区别?如果使用内联函数?这些问题将是下面要讲的。
内联函数:就一句话,如果一个函数被声明为内联函数,编译器在编译代码的时候会在调用内联函数代码的地方将这个函数定义全部代入,执行的时候,就作为函数的一部分,而不是跳转到调用的函数。
举个例子:下面定义了一个内联函数
根据上面的定义,那么在编译的时候,上面的调用 test_A,test_B函数在分配内存的位置上是不一样的。大概如下:
这两者有什么区别呢?这就是内联函数的作用。
我们知道,在内存里面地址进行跳转是需要时间开销的,这就是递归在时间开销大的缘故,这里也一样,内联代码因为不需要跳转,在时间上面会比较快速,但是也有一个不好的地方,增加了代码的空间开销。这个就要求程序员根据自己的实际情况选择,如果调用函数的次数比较多,那么用内联函数比较实惠(哈哈);如果不是,倒也没什么区别。
到这里可能有人问,C里面不是也有一种类似内联函数的功能的么?是的,那就是C里面的宏定义。但是宏定义也有一些需要注意的地方,下面对比一下:
既然了解了内联函数的工作原理,那么我们怎么使用内联函数呢?
上面在解析前面几个问题的时候提供了一种使用方法,这里不再赘述。
内联函数:就一句话,如果一个函数被声明为内联函数,编译器在编译代码的时候会在调用内联函数代码的地方将这个函数定义全部代入,执行的时候,就作为函数的一部分,而不是跳转到调用的函数。
举个例子:下面定义了一个内联函数
#include<iostream.h> Inline double test_A(double a){return a;}; Double test_B(double a){return a;} Int main() { double b=0.1; test_A(b); test_B(b); Return 0; } |
#include<iostream.h> Inline double test_A(double a){return a;}; double test_B(double a){return a;} Int main() { double b=0.1; test_A(double b){return b;};//这里因为test是内联函数,所以会把整个函数代码带进去,即test是代码的一部分。 test_B(b);//这里不是内联,所以会分配一块独立的内存给函数,运行到这里,回调到这个函数的地址去,调用完之后,再调回来。 Return 0; } |
我们知道,在内存里面地址进行跳转是需要时间开销的,这就是递归在时间开销大的缘故,这里也一样,内联代码因为不需要跳转,在时间上面会比较快速,但是也有一个不好的地方,增加了代码的空间开销。这个就要求程序员根据自己的实际情况选择,如果调用函数的次数比较多,那么用内联函数比较实惠(哈哈);如果不是,倒也没什么区别。
到这里可能有人问,C里面不是也有一种类似内联函数的功能的么?是的,那就是C里面的宏定义。但是宏定义也有一些需要注意的地方,下面对比一下:
既然了解了内联函数的工作原理,那么我们怎么使用内联函数呢?
上面在解析前面几个问题的时候提供了一种使用方法,这里不再赘述。
相关文章推荐
- C++学习序列笔记之函数原型和函数定义
- C++学习笔记之模板(1)——从函数重载到函数模板
- C++学习笔记(13)——利用对象、引用、指针调用虚函数
- C++学习笔记之继承层次中的函数调用。
- 【C++学习笔记】函数返回和函数重载
- VS2010 C++ 学习笔记(一) 引用 函数参数默认值 函数重载 内联inline
- C++学习序列笔记之数据处理(复合类型)
- C/C++中关于地址、指针和引用变量的学习笔记(四) : 函数
- (C/C++ 学习笔记)函数指针语法基础
- [C++学习笔记]自定义函数的传值方法
- C++学习笔记-----operator=函数处理自赋值
- C++学习笔记7 C++函数的升级 上
- C++学习笔记--继承的赋值兼容和函数重写
- Effective c++学习笔记——条款5:了解C++默默编写并调用哪些函数
- C++学习笔记-函数声明
- C++学习笔记(八):函数重载、函数指针和函数对象
- C++学习笔记:函数模板
- C++函数指针 学习笔记
- C++学习笔记十二之函数重载
- <C++学习笔记>函数模板 template