inline函数

谁说胖子不能爱 提交于 2019-12-17 23:08:05

                                                                          inline函数

1.什么是inline函数 

       内联函数是指用inline关键字修饰的函数。如果内联函数在类体内定义,不用inline关键字声明,默认为内联函数,在编译阶段遇到函数调用直接进行代码展开。

2.内联具体是怎么实现的?

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

3.inline函数的优缺点

    优点:

              没有函数的开栈与清栈过程使得效率高。

    缺点:

             1. 以代码膨胀为代价,用空间换取了时间。

             2.如果内联函数发生了改动,那么就需要重新编译代码;
             3.要把内联函数放在头文件中;

建议:

              开栈和清栈消耗 >  执行的消耗    代码少    设置为inline函数

              执行的消耗 >  开栈的消耗        代码多      不设置inline函数

4.inline函数注意事项

             1.inline的定义和实现写在头文件中,

             2.inline 函数只在release版本生效,

       3.inline函数只是给编译器的一个建议,所以最后能否真正内联,看编译器的意思,它如果认为函数不复杂,能在调用点展  开,就会真正内联,并不是说声明了内联就会内联。(例如,递归,for,switch等 )

inline void Print(int *arr, int len)  //len在运行阶段才知道数值
{
	if (len == 0)
		return ;
	Print(arr, len - 1);
	cout << arr[len - 1] << " ";
}

       4.inline函数基于实现,不是基于声明

5.inline函数与宏的区别

      宏:不是一个函数,在预编译阶段,进行简单的文本替换,没安全检查,没类型检查,是不安全的

      inline函数:在编译阶段,调用点展开,有安全检查和类型检查,是安全的。(一种     更安全的宏)

6.inline函数和static修饰的函数的区别:

1.普通函数在被调用的时候,系统首先要到函数的入口地址去执行函数体,执行完成之后再回到函数调用的地方继续执行;

   内联函数不需要寻址,当执行到内联函数的时候,将此函数展开,加快了程序的运行速度,因为不需要中断调用,在编译的时  候内联函数可以直接镶嵌到标代码中。

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

3.普通函数 ,产生global符号,整个项目可以连接使用;

inline函数在Debug版本产生local符号,release版本不产生符号,在本文件中可见。

 

 

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!