如何减少函数调用开销,提高程序运行效率?

如何减少函数调用开销,提高程序运行效率?

C风格:使用宏定义#define

#include <iostream>  
using namespace std;  
  
#define add_num(x,y) x+y  
  
int main()  
{  
    cout << add_num(8, 9) << endl;  
} 

 

但是由于#define中形参x,y没有确定的类型,因此宏定义只能实现对于x,y的简单处理,比如加减乘除,输出x,y等等,注意,其中不能在宏中定义其他变量,而且宏不能有返回值。如下错误示例:

#include <iostream>  
using namespace std;  
  
#define add_num(x,y) {  
    int z = x + y;  
    return z;  
}  
  
int main()  
{  
    cout << add_num(8, 9) << endl;  
} 

 

输出错误提示:

 

C++风格:内联函数inline

编译器自动声明函数为内联函数的情况

在类自定义类型中,编译器自动将类内定义的成员函数声明称inline,注意:在类内定义的成员函数才被声明称inline类型的,在类内声明,类外定义的不被定义为inline。

#include <iostream>  
using namespace std;  
#include<string>  
  
class Cstudent  
{  
private:  
    int mark;  
    float height;  
    string name;  
public:  
    void input_value(int Dmark, float Dheight, string Dname); // 在类体内声明的成员函数  
    void output_height() // 在类体内定义的成员函数——被声明为内联函数  
    {  
        cout << height << endl;  
    }  
};  
  
void Cstudent::input_value(int Dmark, float Dheight, string Dname) // 在类体外定义的成员函数——普通成员函数  
{  
    mark = Dmark;  
    height = Dheight;  
    name = Dname;  
}  
  
int main()  
{  
    Cstudent student;  
    student.input_value(89, 152.4, "超级霸霸强");  
    student.output_height();  
} 

 

直接定义函数为内联函数

前提:被声明成inline的函数体内语句不可以多,最多15条以内吧(不算递归调用,递归调用看似几条语句其实递归起来很多)。如果函数体语句过多,inline声明符就没用了。

#include <iostream>  
using namespace std;  
#include<string>  
  
class Cstudent  
{  
private:  
    int mark;  
    float height;  
    string name;  
public:  
    void input_value(int Dmark, float Dheight, string Dname); // 在类体内声明的成员函数  
    void output_height() // 在类体内定义的成员函数——被声明为内联函数  
    {  
        cout << height << endl;  
    }  
};  
  
void Cstudent::input_value(int Dmark, float Dheight, string Dname) // 在类体外定义的成员函数——普通成员函数  
{  
    mark = Dmark;  
    height = Dheight;  
    name = Dname;  
}  
  
inline int max_num(int x, int y) // 声明普通函数为内联函数  
{  
    return x > y ? x : y;  
}  
  
int main()  
{  
    Cstudent student;  
    student.input_value(89, 152.4, "超级霸霸强");  
    student.output_height();  
  
    cout << max_num(5, 8) << endl;  
} 

 

 

C语言的宏定义与C++的内联函数的实质

两者的实质均为函数体的替换。如下所示:(以C语言中的宏定义为例)

#define宏定义:

#include <iostream>  
using namespace std;  
  
#define add_num(x,y) {  
    int z = x + y;  
    return z;  
}  
  
int main()  
{  
    cout << add_num(8, 9) << endl;  
}

 

语句替换:

#include <iostream>    
using namespace std;    
        
int main()    
{    
     cout << 8+9 << endl;    
} 

 

 

内联函数与宏定义的优缺点

优点

当一个函数被频繁调用而且实际代码很少时,我们可以用C风格的#define在预定义阶段将宏替换成代码段(由于在预定义阶段执行因此不好纠错),C++风格的inline在编译阶段将对应语句替换成代码段(C++中建议使用内联函数而非宏定义)。

缺点

当代码段太多时,会使得替换后的新代码很冗杂,尤其是编译成汇编语言后,效率会大大折扣,因此,当你函数体代码段较多时,编译器(仅限编译过程中起作用的内联函数,宏定义由于是在与定义阶段执行因此不会被优化)会自动优化,忽视inline内联函数声明符号。

普通函数的缺点

普通函数在转化为汇编语言时,会涉及到压栈,出栈等等的操作,对于大型程序可以,但是对于频繁调用的小程序就不如直接将他们当作不同语句嵌入到主程序中,把他们当作函数去执行,简直是浪费效率。

想要深入了解的同学可以参考:https://www.cctry.com/thread-289482-1-1.html

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

肥肥胖胖是太阳

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值