内联函数和宏定义

来源:互联网 发布:caffe bn层不收敛 编辑:程序博客网 时间:2024/06/07 06:07

          内联函数和普通函数相比,可以加快程序运行的速度,因为不需要中断调用,在编译的时候内联函数可以直接被镶嵌到目标代码中,而宏只是一个简单的替换。内联函数要做参数类型检查,这是内联函数跟宏定义相比的劣势。inline是指嵌入代码,就是在调用的地方把代码直接写到那里去,而不是跳转。对于短小的代码来说inline增加空间消耗换来的是效率提高,这方面和宏定义一模一样,但是inline在和宏相比没有付出任何额外代价的情况下更加安全,至于是否需要inline函数,就需要根据实际情况来取舍了。

        一般内联函数只用于以下情况:

        (1)一个函数不断地重复调用;

        (2)函数只有简单的几行,且函数内不包含for、while、switch语句。

       一般来说,我们写小程序没有 必要定义成inline,但是如果要完成一个工程项目,当一个简单函数被调用多次时,则应该考虑用inline。宏定义在C语言极其重要,除非你不得不这样做,而在C++里用得就少很多了,关于宏的第一规则是绝不应该去使用它,除非你不得不这样做。几乎每个宏都表明了程序设计语言里、程序里或者程序员的一个缺陷,因为它将在编译器看到程序的正文之前重新摆布这些正文。宏也是许多程序设计工具的主要麻烦。所以,如果你使用了宏,就应该准备只能从各种工具,如排错系统、交叉引用系统、轮廓程序等)中得到较少的服务。

       宏定义在代码处不加任何验证的简单替代,而内联函数是直接将代码插入到调用处,而减少了普通函数调用时的资源消耗。宏定义不是函数,只是在编译前即编译预处理阶段,将程序中有关字符串替换成宏体。关键字inline必须与函数定义体放在一起才能使得函数成为内联,仅仅将inline放在函数声明前面不起任何作用,如下所示的函数foo()不能成为内联函数:

inline void foo(int x,int y);void foo(int x,int y){}
       而所下风格的函数foo()则成为内联函数:

void foo(int x,int y);inline void foo(int x,int y){}
       所以说Inline是一种“用于实现的关键字”,而不是一种“用于声明的关键字”。内联能提高函数的执行效率,那么为什么不把所有的函数都定义成内联函数呢。内联是以代码复制为代价的,仅仅省去了函数调用的开销,从而提高了函数的执行效率。如果执行函数体内代码的时间,相比于函数调用的开销大,那么效率的收获就会很少,另一方面,每一次内联函数的调用都要复制代码,将程序的总代码量增大,消耗更多的内存空间。

       有些情况不适于使用内联函数:

        1,如果函数体内的代码较长,使用内联将导致内存消耗代价较高;2,如果函数体内出现循环,那么执行函数体内代码的时间要比函数调用的开销大。inline也不应该出现在函数的声明中。


原创粉丝点击