一、定义
C++中支持内联函数,其目的是为了提高函数的执行效率,用关键字 inline 放在函数定义(注意是定义而非声明)的前面即可将函数指定为内联函数,内联函数通常就是将它在程序中的每个调用点上“内联地”展开。
二、内联函数和一般函数的区别
- 内联函数比一般函数在前面多了一个inline关键字修饰符
- 内联函数是直接复制函数内容,镶嵌到主函数中去的,就是将内联函数的代码直接放在内联函数的位置上,这与一般函数不同。主函数在调用一般函数的时候,是指令跳转到被掉函数的入口地址,执行完被调用的一般函数后,指令再跳转回主函数上继续执行后面的代码;而内联函数是直接将函数的代码直接放在了调用的位置上,所以没有指令跳转,而是按顺序执行。
- 一般函数的代码段只有一份,放在内存的某个位置上,当程序调用它时,指令就跳转过来,执行完再跳转回去;当程序下一次调用它时,指令又跳转过来;而内联函数则是程序中调用几次它,就将内联函数的代码复制几份放在对应的位置上。
- 内联函数一般在头文件中定义,而一般函数在头文件中声明,在cpp文件中定义。 例如:getXXX{return m_XXX;};//这种写法默认就是内联的
三、利弊
- 利:避免了指令的来回跳转,加快程序的执行速度
- 弊:代码被多次复制,增加了代码量,占用更多内存空间
四、使用内联的时机
- 函数本身内容较少,代码较短,功能简单
- 函数被频繁调用,比如循环中的函数
五、不能建议使用内联函数的情况
- 函数代码量多,功能复杂,体积庞大。对于这样的函数,即使使用inline修饰,编译器也不一定响应,可能还是当成一般函数调用。
- 递归函数不能使用内联修饰
六、内联函数和宏
#include <iostream>
using namespace std;
#define SUM(x) x*x
inline int fun(int x)
{
return x * x;
}
int main()
{
int a = SUM(2 + 3);
int b = fun(2 + 3);
cout << "a = " << a << endl;
cout << "b = " << b << endl;
system("pause");
return 0;
}
输出 a= 11;b=25 是因为宏只是机械简单的将入参传入再执行,相当于2+3*2+3,所以得到11。应将宏优化为
#define SUM(x)((x)*(x))
再C++程序中应避免使用宏,可以用内联函数代替。
七、内联函数与类
- 类内定义的函数都是内联函数,不管是否有inline修饰符,有必要时建议将小片段的内联函数定义在类内。
- 函数声明在类内,但定义在类外的看是否有inline修饰符,如果有就是内联函数,否则不是。
- 当把类内函数置为内联函数时,注意在头文件声明,源文件定义时,只有定义内联函数的源文件可以用它,其他文件调用会报错:“找不到函数定义”,见下:
inline.h
class inline_{
public:
inline_(int a_, int b_);
int max(); //只声明,不定义。则只要不调用这个函数就不会报错;
//调用了这个只声明未定义的函数的话,编译的时候就会报错
//因为只有调用的时候,才会产生调用函数的代码
//至于函数的实现在哪里,那不是编译器要考虑的事,
//当调用时链接器才需要查找函数的实现代码并与函数调用代码对上
private:
int a ;
int b ;
};
inline.cpp
#include "inline.h"
inline_::inline_(int a_, int b_) : a(a_), b(b_)
{
}
inline int inline_::max()
{
return a > b ? a : b;
}
main.cpp
int main()
{
cout << "Hello World!" << endl;
inline_ inline__(3, 2);
std::cout << inline__.max();
return 0;
}
报错: 所以需要,在使用内联函数的文件中再进行一次定义:
#include <iostream>
#include "inline.h"
using namespace std;
inline int inline_::max()
{
int nb;
return a > b ? b : a;
}
int main()
{
cout << "Hello World!" << endl;
inline_ inline__(3, 2);
std::cout << inline__.max();
return 0;
}
注意需要保证,在不同文件中对于同一内联函数的定义保持一致,避免歧义。不保持一致也能通过编译,但是会导致程序出现歧义,要注意。
参考链接: https://blog.csdn.net/cppwork/article/details/18662617?ops_request_misc=%257B%2522request%255Fid%2522%253A%2522164998556616780269833202%2522%252C%2522scm%2522%253A%252220140713.130102334…%2522%257D&request_id=164998556616780269833202&biz_id=0&utm_medium=distribute.pc_search_result.none-task-blog-2allbaidu_landing_v2~default-4-18662617.142v8pc_search_result_control_group,157v4control&utm_term=%E5%86%85%E8%BF%9E%E5%87%BD%E6%95%B0&spm=1018.2226.3001.4187 https://blog.csdn.net/qq_33757398/article/details/81390151
|