欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

内联函数

程序员文章站 2022-03-16 08:49:07
...

内联函数

关键字: inline

也叫镶嵌函数

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

内联函数和宏定义

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

#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版本中结果如下

[[email protected] yinyong]$ g++ neilian.cpp
[[email protected] yinyong]$ ./a.out
d = 6a = 7
d = 7a = 8

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

*/

相关标签: 内联函数