zoukankan      html  css  js  c++  java
  • 堆/栈 内存管理相关

    栈区由系统自动分配,自动在栈区申请内存,在存储上是连续的,如果我们在visual studio去查看栈区空间,debug模式下编译器会做一些处理,在分配之间留一些空间,但是实际分配上它是连续存储的,是从高地址向低地址扩展的数据结构,在这种情况下,栈顶的地址和他的最大容量,是固定的,一般来说大概就2m或者1m。

    之所以叫栈也是因为这个原因,就是在一个作用域里,比如说左括号,开始分配内存,当遇到右大括号,把分配的内存再统统销毁掉,这就是先进后出的一个栈结构。

    比如我们申请一个局部变量的int 。系统就会自动分配,当出了作用域之后,系统就会把分配的内容回收销毁掉。

    如果栈的剩余空间不够了,就会导致栈溢出。

    分配栈空间是非常快速的,类似于在机器码中一条cpu指令,因为不需要去做很多额外的操作。

    而堆空间,需要程序自己去控制,通过new/malloc来申请分配堆内存空间,然后再通过delete/free去释放掉内存空间,比起栈分配来说,它不会出了作用域之后就销毁掉,会保留在整个程序运行时间内,直到程序结束。

    堆空间的申请比起栈空间更加的复杂和缓慢。

    在操作系统中有一个空闲地址的链表,当我们分配堆内存的时候,首先回去在链表里去寻找空闲的空间,把这个堆节点从空闲列表中删掉,然后再把空闲空间分配给程序,多余的这部分还会重新放入到空闲链表中

    他是一个向高地址扩展的数据结构,而且因为这个特性,也是不连续的内存区域,堆内存也比较大。但是耗费成本高,所以申请、使用、删除耗费的成本比栈空间要大。

  • 相关阅读:
    Win8系统 Python安装
    一些安卓开源框架整理
    Android 媒体键监听以及模拟媒体键盘的实现 demo
    android View 自动 GONE 问题
    Android 定时器TimerTask 简单使用
    关于Android studio 相对 eclipse 优点
    Java序列化与反序列化
    android shape的使用 边框
    Android Studio 修改 包名 package name
    Android WebView Long Press长按保存图片到手机
  • 原文地址:https://www.cnblogs.com/EvansPudding/p/12566311.html
Copyright © 2011-2022 走看看