局部变量、全局变量、堆、堆栈、静态和全局的区别

来源:互联网 发布:快走丝编程用什么软件 编辑:程序博客网 时间:2024/05/21 06:36

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

栈区是普通的栈数据结构,遵循LIFO后进先出的规则,局部变量安排在那里是ASM时就规定的,这样可以在一个函数结束后平衡堆栈,操作简单,效率高堆(动态区)在这里应当叫堆栈(不要和数据结构中的堆搞混)是程序在编译时产生的一块用于产生动态内存分配使用的块,操作比较栈要麻烦许多,在分配时要判断最优的地址(防止产生无用的内存碎片(由于屡次的NEWDELETE产生的夹在两块使用中内存中的空余小内存(不容易被分配))),分配和回收时的效率比栈低多了栈是系统提供的功能,特点是快速高效,缺点是有限制,数据不灵活;而栈是函数库提供的功能,特点是灵活方便,数据适应面广泛,但是效率>有一定降低。栈是系统数据结构,对于进程/线程是唯一的;堆是函数库内部数据结构,不一定唯一。不同堆分配的内存无法互相操作。

栈空间分静态分配和动态分配两种。静态分配是编译器完成的,比如自动变量(auto)的分配。动态分配由alloca函数完成。栈的动态分配无需释放(是自动的),也就没有释放函数。为可移植>的程序起见,栈的动态分配操作是不被鼓励的!堆空间的分配总是动态的,虽然程序结束时所有的数据空间都会被释放回系统,但是精确的申请内存/释放内存匹>配是良好程序的基本要素。这是我对堆与栈收藏内容~堆是程序员管理的,栈是系统管理的.

另外关于静态和全局的一些问题:

静态变量的特点:

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
原创粉丝点击