添加链接
link管理
链接快照平台
  • 输入网页链接,自动生成快照
  • 标签化管理网页链接

内联函数:

(1) 内联函数定义和作用:

将一个函数声明为 inline ,那么函数就成为内联函数。内联函数通常就是它在程序中每个调用点上“内联地”展开。从定义上看,内联函数跟一般函数不一样,一般函数调用的时候是需要调用开销的(比如出栈入栈等操作),内联函数从定义上看更像是宏,但是跟宏不一样。

内联函数的作用主要就是使用在一些短小而使用非常频繁的函数中,为了减少函数调用的开销,为了避免使用宏(在 c++ 中,宏是不建议使用的)。比如内联函数 inline int func(int x){return x*x;} 在调用的时候 cout<<func(x)<<endl ,在 编译时 将被展开为:

cout<<(x*x)<<endl;

(2) 内联函数相对于宏的区别和优点:

从上面的分析中,可以看出,内联函数在表现形式上与宏很类似。但是内联函数和宏之间的区别很明显。 宏是在预处理时进行的机械替换,内联是在编译时进行的 。内联函数是真正的函数,只是在调用时,没有调用开销,像宏一样进行展开。内联函数会进行参数匹配检查,相对于带参数的宏有很好的优点,避免了处理宏的一些问题。

(3) 如何使用内联函数和禁止内联:

要让一个函数称为内联函数,有两种方法:一种是把函数加上 inline 关键字;一种是在类的说明部分定义的函数,默认就是内联的。

要禁止编译器进行内联,可以使用 #pragma auto_inline 编译指令或者改变编译参数。

(4) 内联函数注意事项:

(1) 内联函数一定会内联展开吗?答案是否定的。对于内联函数,程序只是提供了一个“ 内联建议 ”,即建议编译器把函数用内联展开,但是真正是否内联,是由编译器决定的,对于函数体过大的函数,编译器一般不会内联,即使制定为内联函数。

(2) 在内联函数内部,不允许用循环语句和开关语句( if switch )。内联函数内部有循环和开关,也不会出错,但是编译器会把它当做非内联函数的。

(3) 关键字 inline 必须与函数定义体放在一起才能使函数真正内联,仅把 inline 放在函数声明的前面不起任何作用。 因为 inline 是一种用于实现的关键字,不是一种用于声明的关键字 。内联函数的声明是不需要加 inline 关键字的,内联函数的定义是必须加 inline 的(除了类的定义部分的默认内联函数),尽管很多书声明定义都加了,要注意理解声明和定义的区别。

(4) 在一个文件中定义的内联函数不能在另一个文件中使用。它们通常放在头文件中共享。

(5) 内联函数的定义必须在第一次调用之前 。注意,这里是定义之前,不仅仅是声明之前。对于普通函数,可以在调用之前声明,调用代码之后具体定义(实现函数),但是内联函数要实现内联,必须先定义再调用,否则编译器会把在定义之前调用的内联函数当做普通函数进行调用。

(6) 说明 :上面这些 inline 的注意事项,在编程时要自己注意,因为上面的注意事项不遵守很多并不会引起编译错误,只是会导致写了 inline 的函数不是内联函数,从而与预期的目的不一样。所以很多没法用程序实例说明到底编译器是按照 inline 还是非 inline 调用的,或许分析汇编代码能看出,但是水平有限,就不多分析了。

(5) 一些关于内联的参考文章:

http://www.cppblog.com/fwxjj/archive/2007/04/20/22352.html 关于 c++ 的内联函数

http://www.yuanma.org/data/2007/1211/article_2916.htm inline 函数的一些总结

http://blog.csdn.net/gaoxiaowei/archive/2008/09/02/2866773.aspx C++ 基础 -- 内联函数

1 . inline 函数 1 . 1定义: inline 函数 inline 关键字定义,引入 inline 函数 的主要原因是用它替代 C 中复杂易错不易维护的宏 函数 。 1 . 2 编译器 inline 函数 的处理办法 编译器 在编译阶段完成对 inline 函数 的处理,即对 inline 函数 的调用替换为 函数 的本体。但 inline 关键字对 编译器 只是一种建议, 编译器 可以这样去做,也可以不去做。从逻辑上来说, 编译器 inline 函数 的处理步骤一般如下: (1)将 inline 函数 体复制到 inline . .
inline 函数 1、为什么需要 inline 函数 2、 inline 函数 的使用3、 inline 函数 的总结4、 inline 函数 的适用情况5、内联 函数 与宏定义的区别 1、为什么需要 inline 函数 当程序执行 函数 调用时,系统要建立栈空间,保护现场,传递参数以及控制程序执行的转移等等,这些工作需要系统时间和空间的开销。   当 函数 功能简单,使用频率很高,为了提高效率,直接将 函数 的代码嵌入到程序中。但这个办法有缺点,一是相同代码重复书写,二是程序可读性往往没有使用 函数 的好。   为了协调好效率和可读性之间的矛盾
inline C++ 关键字,在 函数 声明或定义中, 函数 返回类型前加上关键字 inline ,即可以把 函数 指定为内联 函数 。这样可以解决一些频繁调用的 函数 大量消耗栈空间(栈内存)的问题。关键字 inline 函数 声明和定义的时候都要加上,不写系统还是会当成常规 函数 。 普通 函数 的调用要经过“保存现场、转到被调 函数 执行、执行完毕返回调用处、恢复现场”这一系列过程,产生时空开销。而内联 函数 则是将 函数 的代码直接放在了 函数 的位置上,所以没有指令跳转,指令按顺序执行。但是, inline 只适合简单的 函数 使 在C/ C++ 中,为了解决一些频繁调用的小 函数 大量消耗栈空间(栈内存)的问题,特别引入了 inline 修饰符,表示为内联 函数 。 栈空间就是指放置程序的局部数据(也就是 函数 内数据)的内存空间。 inline 定义的类的内联 函数 函数 的代码被放入符号表中,在使用时直接进行替换,(像宏一样展开),没有了调用的开销,效率也很高。 内联 函数 具有一般 函数 的特性,它与一般 函数 所不同之处在于函 . . .