• c++ 堆和栈以及区别


    c++中内存分成5个区:堆、栈、自由存储区、全局静态存储区、常量存储区

    栈是一种连续存储的数据结构,具有先进后出的性质。堆是一种非连续的树形存储数据结构,每个节点有一个值,整棵树是经过排序的,特点是根节点的值最小(或最大),且根节点的两个子树也是一个堆。

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

    堆和栈的区别:

    (1)管理方式:堆中资源由程序员控制(通过malloc/free、new/delete,容易产生memory leak),如果程序员没有释放掉,资源将由操作系统在程序结束后自动回收。栈资源由编译器在需要时自动分配,不需要时自动清除的变量存储区,通常存放局部变量、函数参数等
    (2)系统响应:对于堆,系统有一个记录空闲内存地址的链表,当系统收到程序申请时,遍历该链表,寻找第一个大于所申请空间的空间的堆结点,删除空闲结点链表中的该结点,并将该结点空间分配给程序(大多数系统会在这块内存空间首地址记录本次分配的大小,这样delete才能正确释放本内存空间,另外,系统会将多余的部分重新放入空闲链表中)。对于栈,只要栈的剩余空间大于所申请空间,系统就会为程序分配内存,否则报异常出现栈空间溢出错误
    (3)空间大小:堆是不连续的内存区域(因为系统是用链表来存储空闲内存地址的,自然不是连续),堆的大小受限于计算机系统中有效的虚拟内存(32位机器上理论上是4G大小),所以堆的空间比较灵活,比较大。栈是一块连续的内存区域,大小是操作系统预定好的,windows下栈大小是2M(也有是1M,在编译时确定,VC中可设置)。
    (4)碎片问题:对于堆,频繁的new/delete会造成大量内存碎片,降低程序效率对于栈,它是一个先进后出(first-in-last-out)的结构,进出一一对应,不会产生碎片。
    (5)分配效率:堆由C/C++函数库提供,机制很复杂,因此堆的效率比栈低很多。栈是机器系统提供的数据结构,计算机在底层对栈提供支持,分配专门的寄存器存放栈地址,提供栈操作专门的指令。
     
     
     
     
    http://www.cnblogs.com/yiluyisha/p/9049051.html
     
     
     
    一个由c/C++编译的程序占用的内存分为以下几个部分 
      1、栈区(stack)―   由编译器自动分配释放 ,存放函数的参数值,局部变量的值等。其操作方式类似于数据结构中的栈。 
      2、堆区(heap) ―   一般由程序员分配释放, 若程序员不释放,程序结束时可能由OS回收 。
         注意它与数据结构中的堆是两回事,分配方式倒是类似于链表,呵呵。 
      3、全局区(静态区)(static)―,全局变量和静态变量的存储是放在一块的,
         初始化的全局变量和静态变量在一块区域, 未初始化的全局变量和未初始化的静态变量在相邻的另一块区域。 - 程序结束后有系统释放 
      4、文字常量区  ―常量字符串就是放在这里的。 程序结束后由系统释放 
      5、程序代码区―存放函数体的二进制代码。
  • 相关阅读:
    使用IDEA模拟git命令使用的常见场景
    解决 No converter found for return value of type: class java.util.ArrayList
    Connections could not be acquired from the underlying database! ### The error may exist in mapper/BookMapper.xml
    There is no PasswordEncoder mapped for the id "null"
    The server time zone value '�й���׼ʱ��' is unrecognized or represents more than one time zone
    MySQL错误:2003-Can't connect to MySQL server on 'localhost'(10061 "unknown error")
    镜像源
    读书笔记 Week5 2018-4-5
    [第五周课后作业] 软件创新分析
    C#入门学习笔记
  • 原文地址:https://www.cnblogs.com/ymjyqsx/p/9703846.html
Copyright © 2020-2023  润新知