inline函数

什么是inline函数

内联函数是指用inline关键字修饰的函数。如果内联函数在类体内定义,不用inline关键字声明,默认为内联函数。

引入inline函数的原因

系统中会有这样的场景:for循环调用一个处理函数或则是递归调用一些算法。因为调用一个任意函数都会为这个函数创建栈空间,如果频繁的调用小函数会消耗大量的栈空间,对内存造成很大的压力。为了提高程序执行的效率,C++引入inline,内联函数的代码会被直接插入到每个调用函数的地方,从而减少函数的开销。

内联具体是怎么实现的?

编译器在它的符号表里放入函数类型和参数(包括函数名字和参数类型及返回值类型),另外,编译器看到内联函数和内联函数的分析没有错时,函数的代码也被放入符号表中,代码是以源程序的形式存放还是以编译过的指令存放取决于编译器。

inline函数使用注意点

  1. 在头文件声明和实现inline;
  2. inline只适合函数体内代码简单的函数使用,不能包含复杂的结构控制语句例如while、switch,并且内联函数本身不能是直接递归函数;
  3. inline函数也不是一定会生效,这个修饰只是对编译器的一个建议,所以最后能否真正内联,看编译器的意思,它如果认为函数不复杂,能在调用点展开,就会真正内联,并不是说声明了内联就会内联,声明内联只是一个建议而已。
  4. 关键字 inline 必须与函数定义体放在一起才能使函数成为内联,仅将 inline 放在函数声明前面不起任何作用。C++ inline函数是一种“用于实现的关键字”,而不是一种“用于声明的关键字”。
  5. inline函数在Release版本中不产生符号,也不会进行栈帧开辟等动作,会在调用点进行展开代码;在debug版本中可以调试,会产生一个local的符号,也会进行函数栈帧开辟之类的动作。

inline函数优缺点

  1. 优点:
    它通过避免函数调用所带来的开销来提高程序的运行速度,当函数调用发生时,它节省了变量弹栈、压栈的开销;函数执行完时,它避免了返回原现场的开销。
  2. 缺点:
    (1)内联是以代码的膨胀为代价,对于函数体比较短的函数应该采用内联。但是对于函数体比较长的,内联形式的使用反而会降低效率。
    (2)C++内联函数的展开是编译阶段,这就意味着如果你的内联函数发生了改动,那么就需要重新编译代码;
    (3)要把内联函数放在头文件中;

总结比较

inline函数 static修饰的函数 宏函数
在debug版本产生local符号,release版本不产生符号 产生local符号 不产生符号
debug版本进行栈帧的操作 ,release版本直接在调用点展开代码(编译期间) 进行栈帧操作 文本替换(预编译期间)
debug版本可以调试 可以调试 不能调试
对参数进行类型检查 有类型检查 对参数不进行类型检查
本文件可见 本文件可见 本文件可见

inline函数和宏函数的区别

(1)宏定义不是函数, 只是在预编译期间将程序中有关字符串替换成宏体。预处理器用复制宏代码的方式代替函数的调用,省去了函数压栈退栈过程,提高了效率;
    内联函数本质上是一个函数,但在编译中不单独产生代码,而是将有关代码嵌入到调用处。

(2)内联函数在运行时可调试,而宏定义不可以。

(3)在预编译时期,宏定义在调用处执行字符串的原样替换;在编译时期,内联函数在调用处展开,同时进行参数类型检查。

(4)内联函数可以作为某个类的成员函数,这样可以使用类的保护成员和私有成员。而当一个表达式涉及到类保护成员或私有成员时,宏就不能实现了(无法将this指针放在合适位置)。即内联函数可以访问类的成员变量,宏定义不能。

inline函数和普通函数的区别

(1)普通函数在被调用的时候,系统首先要到函数的入口地址去执行函数体,执行完成之后再回到函数调用的地方继续执行;
内联函数不需要寻址,当执行到内联函数的时候,将此函数展开,加快了程序的运行速度,因为不需要中断调用,在编译的时候内联函数可以直接镶嵌到目标代码中。

(2)内联函数有一定的限制,内联函数体要求代码简单,不能包含复杂的结构控制语句。如果内联函数函数体过于复杂,编译器将自动把内联函数当成普通函数来执行。

(3)普通函数 ,产生global符号,整个项目可以连接使用;
inline函数在Debug版本产生local符号,release版本不产生符号,在本文件中可见。

你可能感兴趣的:(区别)