zoukankan      html  css  js  c++  java
  • C++基础七-内存四区(栈;堆;全局区;代码区)

    内存分区

    来源:https://blog.csdn.net/qq_33515733/article/details/107168302

    图来源:https://blog.csdn.net/chenyijun/article/details/81938287

    1、代码区

    程序C/C++代码存放区,特点是共享(其它程序调用)和只读(防止意外修改)

    2、全局区

    图中橙色区,存放程序中常量、全局变量、静态变量。

    地址从低到高分别存储常量(const修饰的全局变量、字符常量等)、未初始化全局变量与未初始化静态变量(这些未初始化的数据在程序执行前会自动被系统初始化为0或者NULL)

    程序运行时候产生两个区域:栈、堆

    3、堆

    堆是一个大容器,它的容量要远远大于栈,但没有栈那样先进后出的顺序。用于动态内存分配。一般由程序员分配和释放,若程序员不释放,程序结束时由操作系统回收。

    程序员向操作系统申请一段内存,当系统收到程序的申请时,会遍历一个记录空内存结点的链表,找到第一个空间大于或等于所申请空间的堆结点,将该空闲结点从链表中删除,并将该结点的空间分配给程序,如果链表中空闲结点的空间大于申请空间的大小,系统会自动将多余的部分放入空闲链表中,故容易造成内存的碎片化,分配速度较慢,地址不连续

    注意点

    • 程序员申请的内存必须由程序员负责释放,否则会导致内存泄漏,堆的增长方向与内存地址的增长方向相同,因此在堆区上申请空间理论上是没有大小限制的,但是受安装内存条的大小和系统以及其他程序的占用,不是无限大的
    • 程序员申请在堆上的内存,是由程序员自己管理的,不像栈上的变量那样,需要消耗CPU资源判断变量的生命周期,所以不会对CPU造成额外的消耗,这也是程序员申请堆上内存的优点

    4、栈

    栈是一种先进后出的内存结构,由编译器自动分配释放,存放函数的参数值、返回值、局部变量等。在程序运行过程中实时加载和释放,因此,局部变量的生存周期为申请到释放该段栈空间。

    程序自动向操作系统申请分配以及回收,速度快,使用方便,但是程序员无法控制,如果分配失败,抛出栈溢出错误

    注意点

    • const 局部变量也存储在栈区,栈区向地址减小的方向增长
    • 系统为变量在栈上申请内存后,CPU需要不断地判断变量是否已结束使用的生命周期,如果生命周期结束,系统就会释放为这个变量申请的栈内存,这样一来随着在栈上申请的变量增多,会对CPU造成额外的消耗

    堆和栈的比较

    申请方式

    • 栈(stack):系统自动分配,如声明int a; 系统自动在栈空间为a开辟空间
    • 堆(heap):程序猿申请,并指明大小,C中malloc运算符,如char* p = (char *)malloc(sizeof(char)); C++中new运算符,如int *n = new int(10);
    • #include <iostream>
      using namespace std;
      
      
      int* func() {
          //用new分配堆内的内存,这会返回所分配的空间地址
          int* p = new int(20);
          return p;
      };
      
      
      int main( )
      {
          int * arg = func();
          cout << *arg << endl;
          cout << new int(10) << endl;
          delete arg; //从delete从堆区释放内存
          cout << *arg << endl; //已从堆区释放,报错
          return 0;
      }

    注意点

    • 指针p和n本身是在栈中,它们指向的地址空间是堆区的空间

    申请内存大小的限制

    • 栈(stack):在Windows下,栈是向低地址方向扩展的,是一块连续的内存区域,也就是说栈顶的地址和栈的最大容量是系统预先规定好的,在Windows下,一般栈的大小是1M(这个是可以改的,总之是一个编译时就确定的常数),如果申请的空间超过栈的剩余空间,将会抛出overflow
    • 堆(heap):堆是向高地址方向扩展的,是不连续的内存区域,原因是系统使用链表的方式存储堆的空闲结点的,这个链表的遍历方向是由低到高的,堆获得的空间受限于计算系统中有效的虚拟内存,比较灵活

    来源:https://zhuanlan.zhihu.com/p/94507500  与 https://zhuanlan.zhihu.com/p/120997610

  • 相关阅读:
    【转】GPS网平差
    【转】GPS基线的精化处理
    【转】GLONASS全球卫星导航系统
    【转】伽利略卫星导航定位系统
    【转】国外几款GPS卫星历预报软件
    【转】GPS误差来源
    【转】静态控制测量中的常用术语
    Android开发--FrameLayout的应用
    Android开发--LinearLayout的应用
    Android开发--ScrollView的应用
  • 原文地址:https://www.cnblogs.com/cou1d/p/14250731.html
Copyright © 2011-2022 走看看