C++之内联函数inline的使用解析
概念
内联函数是指用inline关键字修饰的函数,在类内定义的函数被默认成内联函数。
内联函数从源代码层看,有函数的结构,而在编译后,却不具备函数的性质。 内联函数不是在调用时发生控制转移,而是在编译时将函数体嵌入在每一个调用处。编译时,类似宏替换,使用函数体替换调用处的函数名。一般在代码中用inline修饰,但是能否形成内联函数,需要看编译器对该函数定义的具体处理。 对内联函数进行任何修改,都需要重新编译函数的所有客户端,因为编译器需要重新更换一次所有的代码,否则将会继续使用旧的函数。 如果想把一个函数定义为内联函数,则需要在函数名前面放置关键字inline,在调用函数之前需要对函数进行定义。如果已定义的函数多于一行,编译器会忽略 inline 限定符。 在类定义中的定义的函数都是内联函数,即使没有使用inline说明符。
下面是一个实例,使用内联函数来返回两个数中的最大值:
#include using namespace std; class one { private: int age; double len; inline int max(int x, int y) { return (x > y) x : y; } }; inline int min(int x, int y) { return (x < y) x : y; } int main() { cout << "max(5, 6):" << max(5, 6) << endl; cout << "min(5, 6):" << min(5, 6) << endl; return 0; }
结果:
max(5, 6):6
min(5, 6):5
process finished with exit code 0
引入内敛函数的目的:提高函数调用的效率。
内联函数特点:
函数体代码量应该较少,一般都是小函数,最好控制在10行以内; 内联函数不允许使用循环语句和开关语句; 内联函数的定义必须出现内联函数第一次调用之前; 在类结构中定义的函数就是类联函数。
内敛函数运行机制:当函数被声明为内敛函数以后,编译器会将内敛函数展开,不是按照通常函数调用机制进行调用。
内联函数的优缺点:
优点:函数体积小,代码运行高效。
缺点:滥用内联函数不易控制内存,很容易导致内存增加,这是典型的以空间换时间的函数。
inline函数放在头文件
关键字inline必须与函数定义体放在一起才能使函数成为内联,仅仅只是将inline放在函数声明前面没有任何实际作用。
下面函数不能成为内联函数:
inline void test(); void test() { cout << "useless function!" << endl; }
下面函数为内敛函数:
void test(); inline void test() { cout << "useless function!" << endl; }
内敛函数是一种用于“实现”的关键字,而不是用来“声明”的关键字。虽然inline函数可以出现在函数声明里面,加上部分书籍存在内联函数声明,但是为了规范inline关键字,请遵照c++函数实现的代码规范(虽然这不会影响函数功能)。请各位大佬认真注意这些细节!
我们也可以单独定义头文件,将内联函数放在其中,这样既能保证每次调用的函数都是相同的,也可以保证在调用点能够找到函数定义从而方便完成函数内联替换。如:
inlinefunc.h
#include using namespace std; #ifndef inlinefunction_inlinefunc_h #define inlinefunction_inlinefunc_h #endif //inlinefunction_inlinefunc_h inline double square(double n) { return n * n; } inline void printsomething(){ cout << "this is inline function!" << endl; }
main.cpp
#include #include "inlinefunc.h" using namespace std; int main() { printsomething(); cout << "this number's square is " << square(5.0) << endl; return 0; }
结果:
this is inline function!
this number's square is 25
process finished with exit code 0
面试题
一、内联函数和宏定义的区别?
参考答案:
1. 内联函数运行时可以调试,而宏定义不可以。
2. 编译器会对内联函数的参数类型做安全检查或自动类型转化,宏定义不会。
3. 内联函数可以访问类的成员变量,宏定义不能。
4. 在类中声名同时定义的成员函数,自动转化为内联函数。
5. 内联函数将代码直接插入调用处,减少普通函数调用资源,宏是在代码调用处不加任何验证的简单替换。
6. 内联函数是函数,宏不是函数。
二、内联函数在与类的作用关系?
在类中定义函数直接为内联函数,如果只是声明函数则可以不用(强迫症的我受不了,必须不用啊)内联函数。要是在类外需要声明内联函数必须加上inline关键字。
推荐阅读
-
C++ 基础学习之使用有返回值的函数以及函数变体讲解
-
C++中模板类使用友元模板函数 和友员非模版函数!使用不当出现编译错误:无法解析的外部符号…
-
c/c++中内联函数的定义,为什么需要内联函数?内联函数的使用
-
C++之内联函数inline的使用解析
-
C/C++ 之 printf 输出函数的使用
-
C++ 基础学习之使用有返回值的函数以及函数变体讲解
-
c/c++中内联函数的定义,为什么需要内联函数?内联函数的使用
-
kotlin的内联函数之inline、noinline、crossinline、reified
-
c/c++中的inline(内联函数)
-
C++中的内联函数(inline)(C++入门)