美文网首页
2020-11-02

2020-11-02

作者: 声声乌龙_yq | 来源:发表于2020-11-02 16:46 被阅读0次

    值类型与引用类型

    值类型:数值类型,结构体,枚举,它是每一个实例都保存有各自的数据。值类型的变量直接存储数据,分配在托管栈中。变量会在创建它们的方法返回时自动释放。
    引用类型:数组,用户定义的类、接口、委托,Object,字符串,NULL类,它是多实例共享一份数据。

    值类型与引用类型的区别

    最基本的区别是 "值类型"通过拷贝(在赋值,初始化,参数传递中)会创建一个拥有独立数据的实例;引用类型拷贝, 从另一方面来说, 是隐式的创建了一个共享实例. 在拷贝后, 两个变量实际引用到了同一个实例, 也就是说修改第二个变量的值同样会影响原始值。

    序号 值类型 引用类型
    存储方式 直接存储数据本身 存储的是数据的引用,数据存储在数据堆中
    内存分配 分配在栈中 分配在堆中
    效率 效率高,不需要地址转换 效率低,需要进行地址转换
    内存回收 使用完后立即回收 使用完后不立即回收,而是交给GC处理回收
    赋值操作 创建一个新对象 创建一个引用
    类型扩展 不易扩展,所有值类型都是密封(seal)的,所以无法派生出新的值类型 具有多态的特性方便扩展
    实例分配 通常是在线程栈上分配的(静态分配),但是在某些情形下可以存储在堆中 总是在进程堆中分配(动态分配)

    引用类型和值类型在内存中怎么存储?

    值类型-在栈内存中存储
    引用类型-在托管堆内存中存储

    栈与堆的不同!
    引用类型实例存在堆中,值类型实例比如结构存在于一个称为栈的内存区域中。如果值类型实例是一个类的一部分,值会和类一起存在堆中。

    栈被用于静态存储分配,堆被用于动态存储分配,它们都存在计算机的RAM中。

    栈被CPU紧密管理并优化,当一个函数创建一个变量,栈会存储这个变量,并在函数退出时候被毁掉。被分配到栈的变量直接存储在内存上,访问这段内存非常快。当一个函数或者方法调用另一个函数,另一个函数再依次调用其他函数等等,直到最后一个函数返回它的值之前,其他所有函数都会保持暂停执行。

    栈总是按照LIFO顺序保留,最新保留的区块总是会下一个释放。这使得跟踪记录栈非常简单,释放一个栈上的区块不过是调整一个指针。因为栈非常组织有序,所以它快捷高效。

    系统使用堆存储被其他对象引用的数据,堆是一大片内存,系统可以从中请求并动态分配内存区块。堆并不会像栈一样自动毁掉它的对象,需要外部工作来处理这些。在苹果设备中ARC就做这个工作。引用数量会被ARC追踪,当它变为0时对象会被释放。因此整个过程(分配,追踪引用,释放)会比栈要慢。所以值类型要快于引用类型。

    相关文章

      网友评论

          本文标题:2020-11-02

          本文链接:https://www.haomeiwen.com/subject/smemvktx.html