Chinaunix首页 | 论坛 | 博客
  • 博客访问: 309211
  • 博文数量: 36
  • 博客积分: 2546
  • 博客等级: 少校
  • 技术积分: 530
  • 用 户 组: 普通用户
  • 注册时间: 2008-01-15 10:28
文章分类

全部博文(36)

文章存档

2012年(1)

2011年(2)

2009年(4)

2008年(29)

我的朋友

分类: C/C++

2008-06-04 16:45:01

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

栈区是普通的栈数据结构,遵循LIFO后进先出的规则,局部变量安排在那里是ASM时就规定的,这样可以在一个函数结束后平衡堆栈,操作简单,效率高
堆(动态区)在这里应当叫堆栈(不要和数据结构中的堆搞混)是程序在编译时产生的一块用于产生动态内存分配使用的块,操作比较栈要麻烦许多,在分配时要判断最优的地址(防止产生无用的内存碎片(由于屡次的NEW和DELETE产生的夹在两块使用中内存中的空余小内存(不容易被分配))),分配和回收时的效率比栈低多了
---------------------------------------------------------------

栈是系统提供的功能,特点是快速高效,缺点是有限制,数据不灵活;而栈是函数库提供的功能,特点是灵活方便,数据适应面广泛,但是效率 >有一定降低。栈是系统数据结构,对于进程/线程是唯一的;堆是函数库内部数据结构,不一定唯一。不同堆分配的内存无法互相操作。栈空间分静态分配和动态分配两种。静态分配是编译器完成的,比如自动变量(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、  静态全局变量普通全局变量的区别在于:静态全局变量的作用域仅限于所在的源文件。

---------------------------------------------------------------

---------------------------------------------------------------

---------------------------------------------------------------

阅读(1999) | 评论(1) | 转发(0) |
给主人留下些什么吧!~~

chinaunix网友2008-07-17 22:19:23

2、 静态局部变量与普通局部变量的区别在于:静态局部变量只初始化一次,下一次初始化实际上是依然是上一次的变量; 补充: 静态局部变量的存储空间不会被编译器收回,一直保留直至程序结束。