由于数组是结构化的(值类型),它在编译时在堆栈内存中分配。但是我们可以增加数组的大小,在运行时添加元素,即使在堆栈中分配的内存是固定的。这是如何可能的,它是如何工作的,它在哪里需要内存扩展?如果数组将引用作为值类型保存,那么存储对象的引用是否需要内存?如果数组元素也是值类型呢?
lnvxswe21#
Array根本不包含对象。它包含一个Buffer,其中包含一个Storage。用于缓冲区和存储的特定类型取决于各种因素,包括数组的大小以及是否需要桥接到ObjC。一个示例配对是_ContiguousArrayBuffer和_ContiguousArrayStorage。存储是引用类型,并且是堆分配的。数组呈现值 * 语义 *。这并不意味着它们的存储完全在堆栈上。在内部,它们可以有引用类型(甚至与其他Array值共享缓冲区,这是它们经常做的),只要它们呈现一个等效于每个Array独立的接口。这是写时复制优化的基础。
1条答案
按热度按时间lnvxswe21#
Array根本不包含对象。它包含一个Buffer,其中包含一个Storage。用于缓冲区和存储的特定类型取决于各种因素,包括数组的大小以及是否需要桥接到ObjC。一个示例配对是_ContiguousArrayBuffer和_ContiguousArrayStorage。
存储是引用类型,并且是堆分配的。
数组呈现值 * 语义 *。这并不意味着它们的存储完全在堆栈上。在内部,它们可以有引用类型(甚至与其他Array值共享缓冲区,这是它们经常做的),只要它们呈现一个等效于每个Array独立的接口。这是写时复制优化的基础。