[每日C语言」内联函数inline

通常函数调用需要一定的时间开销。这意味着执行调用时需要花费时间用于建立调用、传递参数,跳转到函数代码段并返回。

我们知道使用类函数宏的一个原因就是可减少执行时间。

C99提供另一方法:内联函( nline function)。C99标准这样叙述:“把函数变为内联函数将建议编译器尽可能快速地调用该函数,上述建议的效果由实现来定义”。因此,使函数变为内联函数可能会简化函数的调用机制,但也有可能不起作用。

创建内联函数的方法是在函数声明中使用函数说明符 inline。通常,首次使用内联函数前在文件中对该函数进行定义。因此,该定义也作为函数原型。也就是说,代码应像下面这样:

[每日C语言」内联函数inline


编译器看到内联声明后会用 eatline()函数体代替函数调用,其效果如同您在此处键入了函数体的代码:

[每日C语言」内联函数inline


看一个直观简单的内联函数的例子:

[每日C语言」内联函数inline


这是标准的内联函数的用法,在每个for循环的内部任何调用dbtest(i)的地方都换成了(i%2>0)?"奇":"偶"这样就避免了频繁调用函数对栈内存重复开辟所带来的消耗。

内联函数的特点:

  • 关键字inline 必须与函数定义体放在一起才能使函数成为内联,仅将inline 放在函数声明前面不起任何作用。这就意味着内联函数的定义和对该函数的调用必须在同一个文件中,正是由于这样,内联函数通常具有内部链接,因此,在多文件程序中,每一个调用内联函数的文件都要对该函数进行定义。达到这个目标最简单的方法是:在头文件中定义内联函数,并在使用该函数的文件中包含该头文件。我们一般不在头文件中放置可执行代码,但是内联函数是一个意外,它具有内部链接,所以在多个文件中定义同一个内联函数不会产生什么问题。
  • inline只适合函数体内代码简单的函数使用,不能包含复杂的结构控制语句。例如while、switch,并且内联函数本身不能是直接递归函数。
  • 内联是以代码膨胀(复制)为代价,仅仅省去了函数调用的开销,从而提高函数的执行效率。如果执行函数体内代码的时间,相比于函数调用的开销较大,那么效率的收获会很少。另一方面,每一处内联函数的调用都要复制代码,将使程序的总代码量增大,消耗更多的内存空间

声明:本站发布的内容以原创、转载、分享网络内容为主,如有侵权,请联系电话:021-51697771-8029,邮箱:mj@cndns.com ,我们将会在第一时间删除。文章观点不代表本站立场,如需处理请联系我们。

热门TAG

热门视频