内联函数

内联函数

关键字: inline

也叫镶嵌函数

  • 函数调用需要建立栈内存环境, 进行参数传递, 并产生程序执行转移, 这些工作都需要一些时间开销, 有些函数使用频率高, 但是代码很短
  • c++提供inline函数, 减少函数调用成本.
  • 编译器看到inline后, (一般)为该函数创建一段代码, 以便在后面每次调用都用一段代码来替换, 内联函数的初衷是为了空间换取时间的更快, 所以不能在内联函数内加上switchfor等语句, 避免代码量增大, 但是是否把当前函数作为内联函数并不是关键字就能决定的, 编译器会左右.
  • 内联函数的声明
    • 内联函数可以在一开始仅声明一次
    • 内联函数必须在调用之前被声明或定义, 因为内联函数的代码必须在替换之前已经生成被替换的代码
    • 在实现的时候可以不用加inline
  • 递归函数不能被声明为内联函数

内联函数和宏定义

  • 宏定义可以替换小函数, 但是有缺陷
  • 宏定义告诉编译器简单的替换代码, 不检查参数类型
  • 如果设计到运算的时候宏定义不能代表程序员的意图
  • 宏定义的作用往往可以用内联函数代替, 并且相比具有了检查参数的作用
#include 

#define Max(a,b) (a) > (b) ? (a):(b)

inline int max(int a,int b)
{
        return a > b ? a:b;
}

int main()
{
        int a = 5;
        int b = 3;

        int d = Max(a++,b);
        std::cout << "d = "<< d << "a = "<< a << std::endl;
        d = max(a++,b);
        std::cout << "d = "<< d <<"a = "<< a << std::endl;
        return 0;
}

/*
在centos 7.3版本中结果如下

[c@iZ2zefp1a5tgphjvdf5gh1Z yinyong]$ g++ neilian.cpp
[c@iZ2zefp1a5tgphjvdf5gh1Z yinyong]$ ./a.out
d = 6a = 7
d = 7a = 8

说明在内联函数中的运行结果与我们期盼的一致, 但是宏定义出现偏差
原因如下:
	Max(a++,b)  (a++)>b?(a++):b
	会替换成如下过程执行,执行结束a = 7, 

*/

你可能感兴趣的:(C++)