zoukankan      html  css  js  c++  java
  • 堆和栈

                                                                                                                  堆和栈

                                       这里说的是在内存中的堆和栈

           堆:自己分配空间的大小,更灵活但因为在堆上存的是值(引用类型的值)但还需要在栈上存地址,并且堆会寻找第一个空间大于所申请空间的地址,然后将该地址从空闲结点链表中删除,并将该地址的空间分配给程序,大小并不一定一致,所以会移除多余的部分,形成新的空间。所以较慢。(reference 后 的理解)

           栈:系统分配空间,空间的大小系统设置好了(大约1~2mb),存的是值类型的值。不是自己设置的,只要栈的剩余空间大于所申请空间,系统将为程序提供内存。没有分配空间后的其他操作,所以比堆快。

     

       堆和栈在变量声明时的对比:

     栈:

      int num;    //在栈上开辟空间存储值(值类型)

     int[]  nums=new int[] /因为new 了,所以在堆上开辟空间存储具体的值,而在栈上会存一个内存地址指向存值的堆上的空间

     

    堆和栈的比喻(我自己的理解不是很好,这个是网上的比喻)

    堆和栈的区别可以引用一位前辈的比喻来看出: 
        使用栈就象我们去饭馆里吃饭,只管点菜(发出申请)、付钱、和吃(使用),吃饱了就走,不必理会切菜、洗菜等准备工作和洗碗、刷锅等扫尾工作,他的好处是快捷,但是自由度小。 
        使用堆就象是自己动手做喜欢吃的菜肴,比较麻烦,但是比较符合自己的口味,而且自由度大。比喻很形象,说的很通俗易懂,不知道你是否有点收获。

    自己的理解:

    栈是系统分配空间的,主要存值类型和引用类型的地址,如int 分配空间是的大小是固定的如果是int类型那空间的大小应该是Int类型的最大值,其他基本类型相同,系统设置是给的空间较小;

    堆是自己定义变量时设置的大小,存引用类型的值。系统原本就有n个空的空间,当你定义一个引用变量时,会找一个大小相似但可能并不完全一致的空间把地址给栈上存储,而那块空间存具体的值,还会把多出的部分移除,形成新的空间。

     

                                                                                                      封箱和拆箱

     (reference 网上)

    C#中,封箱特指把struct定义的“值型”转换成class 定义的“引用型”,
    int i=5; object o=i; //自动封箱
    拆箱把引用型变成值型
    int i=(int) o;//C#无自动拆箱,手工拆

    Java中封箱特指把变成“基础型”变成“类型”
    Integer i=5;//自动把int变成Integer,Java 5版之后的自动拆封箱功能
    拆箱指“类型”变“基础型”
    int i=new Integer(5);

    关于ToString的装箱问题:
    例(C#中)
    int i=0; //int类型变量

    i.ToString //未装箱

    原因:int 属于System中
    System.ValueType,由该类的方法(ToString)进行转换,使的是方法,没转换
    个人理解:1.每个类型都有ToString方法,那是他本身的方法,直接成字符串,不是转换成object

    2.装换操作一个变量,那些方法应该是生成新的字符串不是在原来的变量上操作。






  • 相关阅读:
    qmake杂
    Qt界面风格设置
    qss使用详解
    QT数据库操作
    Qt语言家的简单使用
    c++11之右值引用和std::move
    c++11之类型萃取type_traits
    c++11之std::bind和function
    c++11之lambda
    vue中input输入框无法输入
  • 原文地址:https://www.cnblogs.com/xiangtianxiayu/p/4772045.html
Copyright © 2011-2022 走看看