static ; extern; dregisrer的用法以及静态动态内存

1.自动变量
在函数中如果不加static,再函数调用结束则该变量自动释放,系统对其分配动态的储存空间,比如一个函数调用多次,其中的变量如果没有加static关键字那么每次调用变量的地址可能都不相同。如果再符合语句中定义,也会在符合语句结束后释放。复合语句(循环,+=)
2.静态局部变量static
1)如果在一个函数中加入static关键字,那么该变量为静态局部变量,在函数调用完后变量的值不施放, 内存空间仍然存在。 例如如下函数

#include<iostream>
using namespace std;
int fun()
{
 static int a = 0;
 int b = 0;
 a++, b++;
 return a + b;
}
int main()
{
 for (int i = 0; i < 4; i++)
  cout << fun() << endl;
// cout << a << endl;  语句报错,a的值不能被主函数访问,不在同一个作用域;
 system("pause");
 return 0;
}

打印结果为:

由此可以看出 a的值并没有被删除,而b在函数结束时初始化;
2)如果一个全局变量前加了static,在另一个文件中用extern将无法使用,只能在该文件中使用

3.extern 外部扩展变量的作用域
1).如果变量定义在了后面,而在之前需要使用则在变量前加extern
2).可以连接外部源程序,例如在一个源文件定义了A,在B中可定义A前加入extern这个关键字
注意不管在别的文件中定义 还是本文件的下方定义都只能出下一次 不然重定义

4.dregisrer寄存器变量,直接把这个变量放在寄存器中。提高运行效率不过目前编译器会自动识别,一般不需要我们自己写。

5.静态内存和动态内存的区别
1.静态内存是指在程序开始运行时由编译器分配的内存,它的分配是在程序开始运行期间完成的,不占用CPU资源。程序中的各种变量,在编译时系统已经为其分配了所需的内存空间,当该变量在作用域内使用完毕时,系统会自动释放所占用的内存空间。变量的分配与释放,都无须程序员自行考虑。如:基本类型,数组。

2.动态内存:用户无法确定空间大小,或者空间太大,栈上无法分配时,会采用动态内存分配。

3.二者区别:

a) 静态内存分配在编译时完成,不占用CPU资源; 动态内存分配在运行时,分配与释放都占用CPU资源。

b) 静态内存在栈(stack)上分配; 动态内存在堆(heap)上分配。

c) 动态内存分配需要指针和引用类型支持,静态不需要。

d) 静态内存分配是按计划分配,由编译器负责; 动态内存分配是按需分配,由程序员负责。
 3.静态储存期和动态储存期
 1.静态存储期:一般全局变量 已经有static修饰的变量
 2.动态存储期:函数形式的参数,函数体中定义未加static的变量;函数调用的现场保护和返回地址等

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值