如果函数体代码比较多,需要较长的执行时间,那么函数调用机制占用的时间可以忽略;如果函数只有一两条语句, 那么大部分的时间都会花费在函数调用机制上,这种时间开销就就不容忽视。
为了消除函数调用的时空开销,
C++
提供一种提高效率的方法,即在编译时将函数调用处用函数体替换,类似于
C
语 言中的宏展开。这种在函数调用处直接嵌入函数体的函数称为内联函数(Inline Function
),又称内嵌函数或者内置 函数。
关键字
inline
必须与函数定义体放在一起才能使函数成为内联
语法:
inline type funcname(paramterType params){
return [val];
]
以下是错误的用法,因为内联函数的 inline 关键字,只能放在函数定义的地方
C++储存类
inline void Foo(int x, int y);
// inline
仅与
函数声明放在一起
inline是一种“用于实现的关键字”,而不是一种“用于声明的关键字”,一般的用户可以看到函数 的声明,但是看不到函数的定义,尽管在大多数教科书中内联函数的声明、定义体前面都加了 inline 关键字,但我认为 inline不应该出现在函数的声明中。
void Foo(int x, int y)
{
}
使用限制
inline
的使用是有所限制的,
inline
只适合涵数体内代码简单的函数数使用,
不能包含复杂的结构控制语句例如
while
、
switch
并且内联函数本身不能是直
接递归函数
(
自己内部还调用自己的函数
)
函数重载
在C中,我们定义的变量名和函数名在同一作用域预定是不允许重复的。
但在C++ 中,允许我们为函数设置相同的名字,但这些函数的参数列表的顺序或者类型必须不一致,这就是C++中函数的重载
函数重载的规则
1.函数名称必须相同
2.参数列表必须不同
3.函数的返回类型可以相同也可以不同
4.仅仅返回类型不同不足以成为函数的重载
当发生函数调用时,编译器会根据传入的实参去逐个匹配,以选择 对应的函数,如果匹配失败,编译器就会报错,这叫做重载决议 (Overload Resolution
)。从这个角度讲,函数重载仅仅是语法层 面的,本质上它们还是不同的函数,占用不同的内存,入口地址也 不一样。
![](https://i-blog.csdnimg.cn/direct/dbd4769fd73b4f9a9a75a5c664dc3710.png)
静态变量:
静态储存区的变量是在程序刚开始的时候就会完成初始化,也是整个程序生命周期的唯一一次初始化。
静态储存区一般储存两种变量:static变量和全局变量
static
变量在函数内定义局部变量的时候,作用域只在其函数内,
但是生存周期为整个源程序。即只可以在定义该变量的函数内进行
使用,但是退出该函数后,该变量一直存在,但不可以进行使用。
![](https://i-blog.csdnimg.cn/direct/99a0144f1a264f24bd83c57389a3339a.png)
C++储存类![](https://i-blog.csdnimg.cn/direct/ec74a40026e04f229f08026afff622dd.png)
auto是所有局部变量的默认储存类,在函数内部,加上或者不加上都没关系
static静态储存类:只初始化一次,直到程序结束,它可以保留在多个函数之间调用的值
register注册储存类:寄存器变量在寄存器中分配存储器而不是RAM,其大小与寄存器大小相同,它比其他变量具有更快的访问速度,建议仅使用寄存器变量进行快速访问
ex:在计数器中
register int cout=0;
注意:不能得到寄存器变量的地址
extern外部存储类(一般是多文件):extern变量对所有程序都可见。如果两个或多个文件共享相同的变量或函数,则使用它