static
scene:想将函数中某一变量的值(函数)保存至下一次调用时,且将其访问范围得到限定(即便是 extern 外部声明也不可以)。在程序结束后释放,不占用内存。
static 函数:可在只允许在一个编译单位(某一文件)内使用的某个函数,其他不能进行访问跟调用。
static 变量:在程序开始运行时就存在(完成初始化),在某一限定范围内
注:因为函数在程序运行中被调用,所以静态数据成员不能在任何函数内分配空间和初始化。即存储在静态存储区而非栈区。
扩展:内存分区模型
C++程序在执行时,将内存大方向划分为4个区域
- 代码区:存放函数体的二进制代码,由操作系统进行管理的
- 全局区:存放全局变量和静态变量以及常量
- 栈区:由编译器自动分配释放, 存放函数的参数值,局部变量等
- 堆区:由程序员分配和释放,若程序员不释放,程序结束时由操作系统回收
程序运行前
在程序编译后,生成了exe可执行程序,未执行该程序前分为两个区域.
代码区
存放 CPU 执行的机器指令
代码区是共享的,共享的目的是对于频繁被执行的程序,只需要在内存中有一份代码即可
代码区是只读的,使其只读的原因是防止程序意外地修改了它的指令.
全局区
全局变量和静态变量存放在此.
全局区还包含了常量区、字符串常量和其他常量也存放在此.
该区域的数据在程序结束后由操作系统释放.
程序运行后
栈区
由编译器自动分配释放,存放函数的参数值、局部变量等
注意事项:不要返回局部变量的地址,栈区开辟的数据由编译器自动释放
堆区
由程序员分配释放,若程序员不释放,程序结束时由操作系统回收
在C++中主要利用new在堆区开辟内存
inline
scene:每次函数调用时执行一定的时间和空间的开销。而在系统下,栈空间是有限的,假如频繁大量的使用就会造成因栈空间不足而导致程序出错的问题。为了提高程序的运行效率,将功能简单、使用频繁的函数声明为inline以减少函数调用的开销。编译时用内嵌函数体的代码代替函数调用语句,并用实参代替形参。
e.g
inline double add(double x, double y) { return (x+y); }
int main ()
{
double a=2.7,b=3.3;
cout<<add(a+b)<<endl;
return 0;
}
在上述代码中,当编译去遇到add(a,b)时,被替换成(a+b)
使用限制:只适用于简单的程序(循环语句、开关语句、递归调用等不行)。
注意:
1.inline仅是一个对编译器的建议,是否执行inline,得看编译器的意思;
2.类内定义的函数即使不带inline关键字,也是inline函数;
3.的确可以节省运行时间,但却使程序的目标代码量增加;
4.因其定义应出现在被调用之前,并且在调用该函数的每个文本文件中都要进行定义。所以一般将incline函数的定义放在头文件中,使用时仅需用“#include”包含该头文件。