C++内联函数

内联函数的作用

函数调用包含一系列工作,例如保存寄存器,并在返回时恢复,可能需要拷贝实参,程序转向一个新的位置执行等,这些工作会有一定开销,如果把函数代码在调用点上内联地展开,就可以避免这些开销,加快了程序运行速度,代价是程序体积会随着内联的次数增大。

内联函数使用时要注意的

  • 内联函数应该简洁,如果语句过多,则不适合定义为内联函数,最好不要超过10行。
  • 定义在类声明之中的成员函数将自动成为内联函数。
  • 有些函数虽然没有使用inline定义为内联函数,但是编译Release版本时还是有可能会被内联。
  • 有些函数虽然有使用inline定义为内联函数,但是编译器认为这个函数不适合内联时,可以不内联该函数。
  • 内联那些包含循环或switch语句的函数得不偿失,除非那些循环或switch语句很少执行。
  • 内联函数是静态行为(编译时),虚函数是动态行为(运行时),所以虚函数不能被内联。
  • 由于递归函数递归层数未知,在调用点展开时有可能会无限插入代码,所以大部分编译器不支持内联递归函数。
  • 由于编译器在调用点内联展开函数代码时,必须找到函数的定义才能将函数调用替换为函数代码,所以头文件中仅有内联函数声明是不够的(inline关键字必须与函数定义放在一起,仅放置于函数声明前是无效的),头文件中应该有内联函数的定义,当然也可以放在源文件中,但此时只有定义的那个源文件可以用它,而且必须保证其它源文件里的同名内联函数定义是一样的(内联函数可以多次定义),那还不如放在头文件中简单。

下面代码中,inlineFunc在不同源文件中定义了两次,也被调用了两次,但是testFunc()最后输出的却是13不是7。

//Test.cpp
#include "stdafx.h"

inline int inlineFunc(int a, int b)
{
    return a - b;

}


void testFunc()
{
    printf("%d\n", inlineFunc(10, 3));
}
//main.cpp
#include "Test.h"
 

inline int inlineFunc(int a, int b)
{
    return GetTickCount()? a+b:b * (a + b);
}


int main()
{
    std::cout << inlineFunc(1, 2) << std::endl;
    testFunc();
    system("pause");
    return 0;
}
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 内联的疑惑 写这篇文章的初衷源自于对netdata项目把C函数声明为static inline的用法不解。从语言特...
    typesafe阅读 2,193评论 1 1
  • 1. 引入inline关键字的原因 在c/c++中,为了解决一些频繁调用的小函数大量消耗栈空间(栈内存)的问题,特...
    一川烟草i蓑衣阅读 397评论 0 1
  • 1、常量与宏 C++中的const常量可以替代宏常数定义: 我们还可以利用宏来定义宏代码片段: 但是宏代码块不是函...
    _Ke_阅读 567评论 0 0
  • 使用关键字inline来定义,把函数调用处直接进行代码替换。实际上是否进行代码替换由编译器进行最终决定。此外内联函...
    codeflame阅读 1,453评论 0 0
  • 前几天,四川西南航空职业学校的董事会代表宣布学校将给学生放6天的长假,目的说是让学生感受一下春的气息,感受一下大自...
    飞岩文轩阅读 380评论 1 2