C++学习笔记—内联函数

函数调用的原理

“编译过程的最终产品是可执行程序–由一组机器语言指令组成。运行程序时,操作系统将这些指令载入计算机内存中,因此每条指令都有特定的内存地址。计算机随后将逐步执行这些指令。有时(如有循环和分支语句时),将跳过一些指令,向前或向后跳到特定地址。常规函数调用也使程序跳到另一个地址(函数的地址),并在函数结束时返回。下面更详细地介绍这一过程的典型实现。执行到函数调用指令时,程序将在函数调用后立即存储该指令的内存地址,并将函数参数复制到堆栈(为此保留的内存块),跳到标记函数起点的内存单元,执行函数代码(也许还需将返回值放入寄存器中),然后跳回到地址被保存的指令处(这与阅读文章时停下来看脚注,并在阅读完脚注后返回到以前阅读的地方类似)。来回跳跃并记录跳跃位置意味着以前使用函数时,需要一定的开销。”

内联函数

在C++中,以inline修饰的函数叫做内联函数,编译时C++编译器会调用内联函数的地方展开,没有函数压栈开销,内联函数提升程序运行的效率。

1)内联函数是以空间换时间的做法,省去调用函数的额外开销。所以代码很长或者有循环/递归的函数不适宜使用内联。
2)inline对编译器而言只是一个建议,如果定义的函数体内有递归/循环等,编译器优化时会自动忽略掉内联。
3)Inline必须与函数定义放在一起,才能成为内联函数,仅将内联放在声明前是不起作用的。
4)定义在类内的成员函数默认定义为内联函数,可以使用所在类的保护成员和私有成员
4)一般情况下,内联函数只会用在函数内容非常简单的情况,如果内联函数代码过多会造成可读性差等问题。

内联函数的使用

  1. 在函数声明前加上关键字inline
  2. 在函数定义前加上关键字inline
#include <iostream>
using namespace std;

inline double square(double x);

int main() {
    double a,b;
    a = square(5.0);
    b = square(2.2);
    cout << a  << endl;
    cout << b << endl;
    return 0;
}

inline double square(double x){
    return x*x;
}

内联函数和宏定义的区别

1)宏定义不能调试;
2)宏使用简单的文本替换,对于有些情况,在同一个作用域中同一个宏使用两次会出现重定义错误。
看个例子

#include <iostream>
#define SQUARE(X) X*X
using namespace std;

inline double square(double x);

int main() {
    double a,b,c;
    a = square(5.0);
    b = square(2.2+1.1);
    c = SQUARE(2.2+1.1);
    cout << a  << endl;
    cout << b << endl;
    cout << c << endl;
    return 0;
}

inline double square(double x){
    return x*x;
}
/*对于a和b来讲,调用的是内联函数,计算结果正常,符合逻辑。但是对于c来说,使用的是宏定义,通过文本替换来实现。所以计算c的过程如下:c=2.2+1.1*1.1+2.2, 自然结果和b不一样
*/
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值