文章目录
- 一、inline函数
- 二、函数重载
- 三、函数模板
一、inline函数
1.当进行函数的调用时,系统要建立栈空间,保护现场,传递参数等等,这些工作都需要系统时间和空间得开销然而inline 函数是以空间换时间的做法,省去调用函数额外开销。
2.关于inline 函数的一些常见说明
- inline函数的作用:协调效率和可读性之间的矛盾
- 什么情况下采用inline函数:函数的执行开销小于开栈清栈开销(函数体较小),一般来说递归函数不使用inline
3.inline函数与宏定义的区别
内联函数在编译时展开,宏在预编译时展开
内联函数直接嵌入到目标函数中,宏是进行文本替换
内联函数可以进行类型检测,语法判断,宏只是进行替换
二、函数重载
函数重载的定义:函数名相同,参数类型和个数不同
#include<iostream>
using namespace std;
//(?Add@@YAHHH@Z)
int Add(int a, int b) //返回类型可以相同,也可以不同
{
return a + b;
}
//(?Add@@YADDD@Z)
double Add(double a, double b)
{
return a + b;
}
//(?Add@@YANNN@Z)
float Add(float a, float b)
{
return a + b;
}
那么为什么c语言中没有函数重载呢?
答案与名字粉碎技术有关
名字修饰:
修饰名由函数名、类名、调用约定、返回类型,参数共同决定
调用约定:
__stdcall:回调调用约定,函数从右到左的压栈方式,自己在退出时清空堆栈
__fastcall:快速调用约定,函数从右到左的压栈方式,速度快,通过寄存器传入参数
C调用约定:函数从右到左的压栈方式,由调用者把参数弹出栈
thiscall:仅仅适用于“C++”类的成员函数,this指针存放在ECX寄存器中,参数从右到左压
然后c语言名字修饰非常简单,__cdecl是C/C++的缺省调用方式,调用约定函数名字前面加了下划线前缀
三、函数模板
template<class T>
T Add(T a,T b)
{
return a+b;
}
int main()
{
Add(12,23);
Add('a','b');
Add(12.23,23.45);
return 0;
}
图片来自图论教育