06 内联函数

overhead of function call

  1. push parameter
  2. push return address
  3. prepare return values
  4. pop all pushed

内联函数inline, 省去了overhead的时间,是一种以空间换取时间的策略

当调用内联函数时,只是将函数代码嵌入到调用的地方。其他的检查参数步骤都存在。

inline需要在 .h和.cpp 处重复出现。(.h 是给调用该函数的地方看的,而.cpp 是给编译器看的)

// a.h
inline void f()(int i, int j);

// a.cpp
#include "a.h"
#include<iostream>

inline void f(int i, int j) {
    cout << i << " " << j << endl;
}
    
// main.cpp
#include "a.h"

int main(){
    f(10, 0);
    return 0;
}

在链接阶段会报错,编译会有warning
image-20211219233813281

需要将 f函数的body放入 a.h中

// a.h
#include<iostream>
using namespace std;
inline void f()(int i, int j);// 这句话可以不需要了,因为body放在这里了

inline void f(int i, int j) {
    cout << i << " " << j << endl;
}
// a.cpp
#include "a.h"
#include<iostream>
using namespace std;

inline void f(int i, int j) {
    cout << i << " " << j << endl;
}
    
// main.cpp
#include "a.h"

int main(){
    f(10, 0);
    return 0;
}

当函数加了inline后 函数的定义就不再是定义,而是声明。所以内联函数不需要对应的.cpp

与c的宏区别

c的宏没有参数检查
而内联有参数检查

如果inline函数过于复杂,或者拥有递归(则编译器会拒绝inline

成员函数

在class中的使用,可以直接在class里面定义函数体,也可以使用inline关键字

  1. 从运行效率来看,这类没有多余的开销,和直接访问数据的效率一样
    image-20211220000112512
  2. 保持类里面的整洁

image-20211219235811763

inline or not

两三行函数的可以考虑
频繁调用的函数值得做成inline 省掉overhead

超过20行的not
46840274610)]

inline or not

两三行函数的可以考虑
频繁调用的函数值得做成inline 省掉overhead

超过20行的not
有递归的not

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值