C++学习12——内联函数

overhead:额外的开销,总的开销 。

int f(int i){
    return i*2;
}
main(){
    int a=4;
    int b=f(a);
}

调用函数的额外的步骤:

  • 将参数压入栈中

  • 将返回地址压入栈中

  • 准备返回值

  • 取出所有被压入栈中的值

使用内联函数可以省略以上步骤:如果一个函数是内联函数,不会需要以上的步骤,在调用函数时将函数代码放到调用它的地方,且还能保持函数的独立性。

int f(int i){
    return i*2;
}
main(){
    int a=4;
    int b=f(a);
}
//相当于
main(){
    int a=4;
    int b=a+a;
}

内联函数不会出现在最终形成可执行文件里,只会出现在编译器里,不产生.o文件。

inline在.h(给调用的地方看)和.cpp(产生函数)里都必须写inline

inline int plusOne(int x);
inline int plusOne(int x){return ++x;};

a.h

#include <iostream>
using namespace std;//一般不加,取决于.h内的内容
inline void f(int i,int j);//如果删掉声明,会报错,重复定义
inline void f(int i,int j){//不加body部分会报错,这个其实也是一个声明
    cout<<i<<" "<<j<<endl;
}

a.cpp //使用内联函数其实可以省略.cpp文件,有.h和mian.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,10);
    return 0;
}

vi a.h 打开a.h

vi a.cpp 打开a.cpp

vi main.cpp打开main.cpp

g++ main.cpp a.cpp编译运行

g++ main.cpp a.cpp --save-temps 留下刚刚的结果

main.s 汇编指令

more main.cpp 展示main.cpp代码

./a.out 运行

g++ a.cpp -m32 编译成32位

内联函数:空间换时间,占用内存,但是额外开销少了

C的宏的问题不可以做类型检查,而内联函数则可以做内联检查

 

#indefine f(a) (a)+(a)
main(){
    double a=4;
    printf("%d",f(a));//会报错,浮点数不能用%d
}
inline int f(int i){
    return i*2;
}
main(){
    double a=4;
    printf("%d",f(a));//会提示改%d,或者强制类型转换为Int
}

如果inline函数过于巨大(递归一定不可以inline),则编译器可能会拒绝Inline;函数很小,会被编译器自动inline

成员函数在构造时写body,则其为inline函数。

#include<string>
using namespace std;
class Point{
    int i,j,k;
public:
    Point(){i=j=k=0;}//内联函数
    Point(int ii,int jj,int kk){i=ii,j=jj,k=kk;}//内联函数
    void print(string& msg=" "){//内联函数
        if(msg.size()!=0) cout<<msg<<endl;
        cout<<"i="i<<","<<"j="<<j<<","<<"k="<<k<<endl;
    }
};
int main(){
    Point p,q(1,2,3);
    p.print("value of p");//不是真的调用函数,而是将代码插入
    q.print("value of q");//不是真的调用函数,而是将代码插入
}
class Cup{
    int color;
public:
    int getColor(){return color;}
    void setColor(int color){
        this->color=color;
    }
};//将set get函数写成内联函数,调用时它们时相当于直接访问color,从运行效率来看没有区别
class Rectangel{
    int width,height;
public:
    Rectangle(int w=0,int h=0);
    int getWidth() const;
    void setWidth(int w);
    int getHeight() const;
    void setHeight(int h);
};

inline Rectangle::Rectangle(int w,int h):width(w),height(h){}//内联函数,在.h里,而不是在.cpp里,在declaration里,而不在definition
inline int Rectangle::getWidth() const{
    return width;
}

inline:

  • 函数很小,两三行

  • 频繁调用的函数,如在循环里调用

not inline

  • 非常大的函数,超过20行

  • 递归函数

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值