你的位置:首页 > 操作系统

[操作系统]栈、堆


栈(stack)、堆(heap)

概念:堆和栈都是数据结构,是一个特殊的存储区,主要用来暂时存放数据和地址。

栈:其同数据结构中的栈类似。用于存储参数和局部变量。该存储空间不用申请,有操作系统自动分配和释放。

      栈在中文中就说一个仓库,所以类似仓库你先放进去的最后才能取出。也就类似先放进去的最后释放。其实栈是相对较高的地址,以地址的增长方向为上的话,栈地址是向下增长的。

      优点:读取速度较堆要快,

      缺点:灵活性低,数据大小和生命周期有限。栈中存放的数据无法在多线程之间共享。

堆:其同数据结构中的栈不是一个概念。要有程序员自己申请和释放,如果不释放可能在程序结束时,有系统收回。其遵循先进先出的原则。

     优点:比较灵活,能够自己规定分配内存的大小,编译器无法获知其生命周期。

     缺点:由于在运行时才能分配动态空间,会降低运行速度。

具有存储概念的名词还有:全局去,文字常量区,程序代码区

全局区:有static修饰的变量,全局变量和静态变量的存储是放在一块的,程序结束后由系统释放。

文字常量区:有程序结束后系统释放。一些常量字符串就存储在该区。

程序代码区:将代码转换成二进制后存储的区域。

栈就例如我们只要结果,而不必担心如何达到这个结果。

而堆就要为自己的结果负责,自己的行为造成自己的结果。

注意:

1)在main函数之外的都是存储在全局区。

2)在main函数内部,有static 修饰的是全局区。

    变量都处于栈中,字符串是位于常量区。

    分配空间的语句造成的分配在堆。

  这是一个前辈写的,非常详细    
  //main.cpp    
  int   a   =   0;   全局初始化区    
  char   *p1;   全局未初始化区    
  main()    
  {    
  int   b;   栈    
  char   s[]   =   "abc";   栈    
  char   *p2;   栈    
  char   *p3   =   "123456";   123456/0在常量区,p3在栈上。    
  static   int   c   =0;   全局(静态)初始化区    
  p1   =   (char   *)malloc(10);    
  p2   =   (char   *)malloc(20);    
  分配得来得10和20字节的区域就在堆区。    
  strcpy(p1,   "123456");   123456/0放在常量区,编译器可能会将它与p3所指向的"123456"  
  优化成一个地方。    
  }