如何减少函数调用开销,提高程序运行效率?
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