2020-11-02

2020-11-02  本文已影响0人  声声乌龙_yq

值类型与引用类型

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

值类型与引用类型的区别

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

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

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

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

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

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

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

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

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

上一篇 下一篇

猜你喜欢

热点阅读