zoukankan      html  css  js  c++  java
  • 2017/3/1 栈和堆

    定义:两种抽象数据结构
            栈:先进后出 FILO
            堆:队列结构,先进先出; FIFO
    操作系统:
            栈:由操作系统(编译器)自动分配,常用于局部变量,函数参数值,类似于操作系统中的栈FILO
            堆:由用户分配,若不主动释放,则最后由OS回收(Operating System),类似于链表


    参考:http://www.cnblogs.com/munetiey/articles/6484537.html

           预备知识—程序的内存分配
                  一个由C/C++编译的程序占用的内存分为以下几个部分
                  1、栈区(stack)— 由编译器自动分配释放 ,存放函数的参数值,局部变量的值等。其 操作方式类似于数据结构中的栈。
                  2、堆区(heap) — 一般由程序员分配释放, 若程序员不释放,程序结束时可能由OS回 收 。注意它与数据结构中的堆是两回事,分配方式倒是类似于链表,呵呵。
                  3、全局区(静态区)(static)—,全局变量和静态变量的存储是放在一块的,初始化的 全局变量和静态变量在一块区域, 未初始化的全局变量和未初始化的静态变量在相邻的另 一块区域。 - 程序结束后由系统释放。
                  4、文字常量区 —常量字符串就是放在这里的。 程序结束后由系统释放
                  5、程序代码区—存放函数体的二进制代码。


    例:

     1 //全局初始化区
     2 int a = 0;
     3 //全局未初始化区
     4 char* p1;
     5 
     6 
     7 void main()
     8 {
     9     int b;//
    10     char s[] = "abc";//
    11     char* p2;//
    12     char* p3 = "1234";  //   1234/0 在常量区,p3在栈上
    13     static int c = 0;//全局初始化区
    14 
    15     p1 = (char*)malloc(10);
    16     p2 = (char*)malloc(20);
    17     //分配得来的10和20字节在堆区
    18 
    19     strcpy(p1,"1234");//  1234/0在常量区,编译器可能会将它与p3所指向的1234/0优化成同一个地方
    20 }

    机制:
          栈:只要栈的剩余空间大于所申请的空间,系统将为程序提供内存,否则将异常报栈溢出;
          堆:操作系统有一张记录空闲内存地址的链表,当用户申请时,遍历该链表,寻找第一个大于等于用户申请空间的堆结点;

    限制:
          栈:栈是向低地址扩展的数据结构,是一块连续的内存区域,栈的大小有限制,一般为1M或2M
          堆:堆是向高地址扩展的数据结构,大小不受限制,由空闲地址组成的链表结构

    效率:
          申请:栈比堆快
          存储读取:栈比堆快

    存储内容:
          栈:在函数调用中,第一个进栈的是函数调用的下一个可执行语句的地址,然后是参数,然后是局部变量,静态变量不入栈
          堆:一般来说头部保存堆的长度大小,由用户指定

  • 相关阅读:
    inner join on, left join on, right join on讲解(转载)
    ref 与 out
    Shell基础01
    Python 基础01
    linux基础03
    Shell基础02
    linux基础02
    Linux基础01
    linux基础05
    linux基础04
  • 原文地址:https://www.cnblogs.com/munetiey/p/6484663.html
Copyright © 2011-2022 走看看