局部变量、全局变量、堆、堆栈、静态和全局变量

一般全局变量存放在数据区,局部变量存放在栈区
动态变量存放在堆区,函数代码放在代码区
---------------------------------------------------------------

栈区是普通的栈数据结构,遵循LIFO后进先出的规则,局部变量安排在那里是ASM时就规定的, 这样可以在一个函数结束后平衡堆栈,操作简单,效率高

堆(动态区)在这里应当叫堆栈(不要和数据结构中的堆搞混)是程序在编译时产生的一块用于产生动态内存分配使用的块,操作比较栈要麻烦许多,在分配时要判断最优的地址(防止产生无用的内存碎片(由于屡次的NEW和DELETE产生的夹在两块使用中内存中的空余小内存(不容易被分配))),分配和回收时的效率比栈低多了
---------------------------------------------------------------

栈是系统提供的功能,特点是快速高效,缺点是有限制,数据不灵活; 而堆是函数库提供的功能,特点是灵活方便,数据适应面广泛,但是效率 >有一定降低。 栈是系统数据结构,对于进程/线程是唯一的;堆是函数库内部数据结构,不一定唯一。不同堆分配的内存无法互相操作。 栈空间分静态分配和动态分配两种静态分配是编译器完成的,比如自动变量(auto)的分配。动态分配由malloca函数完成。栈的动态分配无需释放(是自动的),也就没有释放函数。为可移植的程序起见,栈的动态分配操作是不被鼓励的!堆 空间的分配总是动态的,虽然程序结束时所有的数据空间都会被释放回系统,但是精确的申请内存/ 释放内存匹>配是良好程序的基本要素。

堆是程序员管理的,栈是系统管理的.
  
另外关于静态和全局的一些问题:
静态变量的特点:

1、  一次存储:静态局部变量只被初始化一次,下一次初始化根据上一次的结果值,有点类似于c++中类的静态成员变量,即无论该类型生成多少个实例对象,所有的对象共用一个静态变量,到这里就是无论这个函数调用多少次,该静态变量只初始化一次,并没有因为超出其生存期而被销毁,只是外部不可见而已,用个例子说明之:

void  fun1( int  v )
{
    static  int  value = v;
    static  int  value = v;
}
int  main( int  arc, char  *args[ ])
{
    fun1( 50 );
    fun1( 100 );
}

        执行的结果是: value : 50  value : 50
        说明在第二次调用 fun1( ) 时的初始化 value 的采用的是上一次 value 的值, value 在静态区的存储空间并没有因为 fun1( ) 的结束而被释放,即体现了一次存储;

2、  作用域限定:静态修饰的作用域限定功能同时体现在函数与变量上;

a)         对于函数而言,任何用static修饰的函数,其作用域仅为当前源文件,而对外部来说这个函数是不可见的,即只有和其在同一源文件中的函数才能调用这个静态函数;反过来说,如果一个函数仅仅被同一源文件中的其他函数调用,那么这个函数应该声明为静态的,这样做的好处在于:可以一定程度上的解决不同源文件之间函数的命名冲突问题;

b)        对于变量而言,static修饰的全局变量,只在当前源文件中有效,对外部不可见,外部文件不能够引用;

顾名思义,全局变量是指能够在全局引用的变量,相对于局部变量的概念,也叫外部变量;同静态变量一样,全局变量位于静态数据区,全局变量一处定义,多处引用,用关键字“extern”引用“外部”的变量。

全局变量也可以是静态的,在前面有过说明,静态全局变量的意义就是不让“外部”引用,是单个源文件里的全局变量,即是编译阶段的全局变量,而不是连接阶段的全局变量。

 

通过上面的分析,我们不难得出以下结论:

1、  静态函数普通函数的区别在于:静态函数不可以被同一源文件以外的函数调用

2、  静态局部变量普通局部变量的区别在于:静态局部变量只初始化一次,下一次初始化实际上是依然是上一次的变量;

3、  静态全局变量普通全局变量的区别在于:静态全局变量的作用域仅限于所在的源文件

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值